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_)
越努力,越幸运!!! good good study,day day up!!!
原文地址:https://www.cnblogs.com/canglongdao/p/13602819.html