前言
元素定位有八种方法,那么有没有一种方法,可以把八种定位合为一种呢?也就是把定位的方式参数化,如,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_)