Selenium3+python3自動化(三十一)--元素定位參數化(find_element)


前言

元素定位有八種方法,那么有沒有一種方法,可以把八種定位合為一種呢?也就是把定位的方式參數化,如,id,name,css等設置為一個參數,這樣只需維護定位方式的參數就行了。find_element()可以實現。

一、find_element()

1.selenium元素定位里面其實是有這個方法的,只是大部分時候都是結合By方法使用,如下圖

# coding:utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
driver=webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.find_element(By.ID,"kw").send_keys("xixi")

 二、查看By方法源碼

pycharm中,按住Ctrl,鼠標左鍵點擊By

class By(object):
    """
    Set of supported locator strategies.
    """

    ID = "id"
    XPATH = "xpath"
    LINK_TEXT = "link text"
    PARTIAL_LINK_TEXT = "partial link text"
    NAME = "name"
    TAG_NAME = "tag name"
    CLASS_NAME = "class name"
    CSS_SELECTOR = "css selector"

 由源碼可知,By.ID相當於是"id",那我們在請求時,可以直接使用"id"替換By.ID,這樣也不用再導入By模塊。

# coding:utf-8
from selenium import webdriver
# from selenium.webdriver.common.by import By
import time
driver=webdriver.Chrome()
driver.get("https://www.baidu.com")
# driver.find_element_by_id("kw").send_keys("xixi")
# time.sleep(2)

# driver.find_element(By.ID,"kw").send_keys("hehe")
# time.sleep(2)
driver.find_element("id","kw").send_keys("gege")

time.sleep(2)
driver.find_element("xpath","//span/input[@id='kw']").send_keys("good")

time.sleep(2)
#注意"link text"中間是空格
driver.find_element("link text","資訊").click()

time.sleep(2)
driver.find_element_by_link_text("新聞").click()

 三、find_element和find_element_by_xxx的區別

1.pycharm中,導入相應的包,按照正常流程書寫,輸入driver.find_element(),按住Ctrl鍵,鼠標左鍵點擊find_element,打開並跳轉到源碼頁面;

2.輸入driver.find_element_by_id(),按住Ctrl鍵,鼠標左鍵點擊find_element_by_id,打開並跳轉到源碼頁面;

3.查看源碼,發現find_element_by_xxx的方法都是返回的find_element方法,也就是說那八個定位方法其實就是八個小分支。

    def find_element(self, by=By.ID, value=None):
        """
        Find an element given a By strategy and locator. Prefer the find_element_by_* methods when
        possible.

        :Usage:
            element = driver.find_element(By.ID, 'foo')

        :rtype: WebElement
        """
        if self.w3c:
            if by == By.ID:
                by = By.CSS_SELECTOR
                value = '[id="%s"]' % value
            elif by == By.TAG_NAME:
                by = By.CSS_SELECTOR
            elif by == By.CLASS_NAME:
                by = By.CSS_SELECTOR
                value = ".%s" % value
            elif by == By.NAME:
                by = By.CSS_SELECTOR
                value = '[name="%s"]' % value
        return self.execute(Command.FIND_ELEMENT, {
            'using': by,
            'value': value})['value']

 

    def find_element_by_id(self, id_):
        """Finds an element by id.

        :Args:
         - id\_ - The id of the element to be found.

        :Returns:
         - WebElement - the element if it was found

        :Raises:
         - NoSuchElementException - if the element wasn't found

        :Usage:
            element = driver.find_element_by_id('foo')
        """
        return self.find_element(by=By.ID, value=id_)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM