目录
在Selenium中可以通过多种方式来定位标签,返回标签元素对象 ,Selenium提供了下面的方法进行元素定位:
- find_element_by_id (返回一个元素)
- find_element(s)_by_class_name (根据类名获取元素列表)
- find_element(s)_by_name (根据标签的name属性值返回包含标签对象元素的列表)
- find_element(s)_by_xpath (返回一个包含元素的列表)
- find_element(s)_by_link_text (根据连接文本获取元素列表)
- find_element(s)_by_partial_link_text (根据链接包含的文本获取元素列表)
- find_element(s)_by_tag_name (根据标签名获取元素列表)
- find_element(s)_by_css_selector (根据css选择器来获取元素列表)
提示:elements是寻找多个元素会返回一个list
除了上面这些公有的方法,我们还有2个私有的方法来帮助页页面对象的定位。
这两个方法就是find_element(by=By.CLASS_NAME, value=name)和find_elements(by=By.CLASS_NAME, value=name)
(新版的Python已经不支持公有的方法,需要写成私有的方法来定位 ):
在使用find_element
和find_elements时,我们需要先导入
from selenium.webdriver.common.by import By
借助 By 来传入定位方式,需要先引入,主要是为了防止定位方式写错。
如果你知道元素的id
属性,那么就使用id
定位吧。在id
定位里,会返回第一个id
属性匹配的元素,如果没有元素匹配,会抛出NoSuchElementException
异常。
- driver.find_element(By.ID, 'value')
- # value为标签元素
示例:
通过百度搜索框标签,进行定位输入
搜索框的id为‘kw’
driver.find_element(By.ID, 'kw')
如果你知道元素的name
属性,那么就用这个定位吧。在name
定位里,会返回第一个name
属性匹配的元素,如果没有元素匹配,会抛出NoSuchElementException
异常。
driver.find_element(By.NAME,'value')
示例:
如上图,百度搜索框的name是‘wd‘
driver.find_element(By.NAME,'wd')
driver.find_element(By.XPATH, 'value')
示例
百度百度搜索框的xpath是’//*[@id="kw"]‘
driver.find_element(By.XPATH, '//*[@id="kw"]')
如果你知道一个锚标签使用了什么文本,那么就使用这种方法。在超链接定位里,会返回第一个文本属性匹配的链接,如果没有元素匹配,会抛出NoSuchElementException
异常。
- driver.find_element(By.LINK_TEXT,'value')
- driver.find_element(By.PARTIAL_LINK_TEXT, 'value')
示例:
已有HTML代码
- <html>
- <body>
- <p>Are you sure you want to do this?p>
- <a href="continue.html">Continuea>
- <a href="cancel.html">Cancela>
- body>
- <html>
可以这样定位 continue.html
链接:
- driver.find_element(By.LINK_TEXT,'Continue')
- driver.find_element(By.PARTIAL_LINK_TEXT, 'Conti')
知道元素标签名就使用这个定位,如果没有元素匹配,会抛出NoSuchElementException
异常。
driver.find_element(By.TAG_NAME,'value')
示例:
-
-
Welcome
-
Site content goes here.
可以这样定位h1
元素:
driver.find_element(By.TAG_NAME,'h1')
知道class
就使用这个定位,只返回匹配的第一个,无元素匹配,会抛出NoSuchElementException
异常
driver.find_element(By.CLASS_NAME,'value')
示例:
用class定位百度搜索框
driver.find_element(By.CLASS_NAME, 's_ipt')