Selenium的八大元素定位方法中,前六种基础定位方法,即id定位,class定位,name定位,tag_name定位,link_text定位和partial_link_text定位。基础定位是基于HTML,通过HTML标签元素的属性或名称完成元素定位,使用起来上手容易,对复杂定位需求可能有点麻烦,故而这里介绍两种高级定位方法:CSS定位和XPath定位。

一、CSS定位

CSS(Cascading Style Sheet)是一种用来表现HTML或XML等文件样式的计算机语言。选择器 作为CSS语言的核心组件,同样提供了元素定位能力。
以访问百度首页为例:

from selenium import webdriver
driver=webdriver.edge()
driver.get("https://www.baidu.com")

1. id选择器定位

#css中id定位
driver.find_elment(By.CSS_SELECTOR, '#kw')
#以上代码等价于id定位
driver.find_elment(By.ID, 'kw')

'#kw’是CSS中的id选择器语法。


2. tag_name选择器定位

#css中tag_name定位
driver.find_elment(By.CSS_SELECTOR,"input")
#等价于下面标签定位
driver.find_elment(By.tag_name, "input")

3. class选择器定位

#css中class定位
driver.find_elment(By.CSS_SELECTOR,".s_ipt")
#等价于下面标签定位
driver.find_elment(By.class_name, "s_ipt")

其中,".s_ipt"是CSS中class选择器语法,当要定位所有class属性是mnav的<a>超链接元素,CSS选择器能力就体现出来:

#css中属性为mnav的超链接元素定位
driver.find_elments(By.CSS_SELECTOR,"a.mnav")
#同样,定位所有class属性值为title-content-title的<span\>
driver.find_elments(By.CSS_SELECTOR, "span.title-content-title ")

4. 属性选择器定位
CSS属性选择器语法为:元素名[属性名=‘属性值’] ,定位具有某属性且属性值特定的元素,也支持多属性集合选择。

#选择一个有name属性且属性值为wd的<input\>元素
driver.find_elment(By.CSS_SELECTOR, 'input[name="wd"]')
#定位<input\>元素的name属性和autocomplete属性同时满足要求的元素
driver.find_elment(By.CSS_SELECTOR, 'input[name="wd"][autocomplete="off"]')

属性选择器除了“等于”比较外,CSS语法还提供了“包含”“以XX开始/结尾”的模糊匹配比较语法。

#模糊属性定位,*表示包含,^表示开头,$表示结尾
driver.find_elment(By.CSS_SELECTOR, 'input[autocomplete*="ff"]')
driver.find_elment(By.CSS_SELECTOR, 'input[autocomplete^="o"]')
driver.find_elment(By.CSS_SELECTOR, 'input[autocomplete$="ff"]')

5. 层级选择器定位
在CSS语法中,层级选择器非常有用,“>”表示直接节点“ ”(空格)代表子孙节点

driver.find_elment(By.CSS_SELECTOR, 'form>span>input')
driver.find_elment(By.CSS_SELECTOR, 'form span input')

层级选择语法与id选择器、class选择器、属性选择器一起使用:

driver.find_elment(By.CSS_SELECTOR, '#form span input[name="wd"])

6. 兄弟选择器定位

#定位id属性为hotsearch-content-wrapper元素的所有li子节点
driver.find_elments(By.CSS_SELECTOR, "#hotsearch-content-wrapper li")

二、XPath定位

XPath是一种用于XML文档中查找信息的语言,是W3C标准的主要元素

1. tag_name定位

   elments = driver.find_elments(By.XPath, "//input")

在XPth语法中, “//” 的语义可以理解为定位子孙节点,"//input"代表在整个HTMLz文档中定位所有的元素。


2. 属性定位

driver.find_elments(By.XPath, "//input[@class]"

在XPath中,过滤属性的语法为 [@属性名] ,属性过滤与标签名称定位可以结合使用。例如,"//input[@class]"的意思是定位所有拥有class属性的元素,无需考虑class属性的值。
若要精确匹配属性值,语法为 [@属性名=“属性值”] ,如下:

driver.find_elment(By.XPath,"//input[@class='s_ipt']")
driver.find_elment(By.XPath,"//input[@id='kw']")

以上代码表示定位class属性为s_ipt和id属性为kw的input元素
查找所有元素中的特定属性值的元素,使用 “*” 代替标签名称:

driver.find_elment(By.XPath,"//*[@id='kw']")

XPath属性查找语法支持与(and)和或(or)等表达式结合使用,以处理多个属性间的关系:

driver.find_elment(By.XPath,"//*[@id='kw' and @autocomplete='off']")

以上代码表示定位整个文档中所有id属性kw且autocomplete属性是off的元素。


3. 层级定位
在XPath语法中,“/”表示在子元素内部进行查找

driver.find_elment(By.XPath, "//form/span/input")

以上代码表示定位元素,然后在其内部查找元素,再通过的子元素定位到元素。


4. 兄弟节点定位
与CSS选择器相比,XPath提供的兄弟节点定位方法,以“[下标]”语法表示选择的元素顺序下标从1开始,方法类似数组的下标访问元素方法:

#第一个<li/>元素
driver.find_elment(By.XPath, "//*[@id='hotseach-content-wrapper']/li[1]")
#第二个<li/>元素
driver.find_elment(By.XPath, "//*[@id='hotseach-content-wrapper']/li[2]")
 #前两个<li/>元素
driver.find_elment(By.XPath, "//*[@id='hotseach-content-wrapper']/li[position()<3]")

以上代码表示定位第一个和第二个 【<li>】 元素,XPath中支持下标值函数计算定位最后一个,倒数第二个这种位置的元素:

 #最后一个<li/>元素
 driver.find_elment(By.XPath, "//*[@id='hotseach-content-wrapper']/li[last()]")
 #倒数第二个<li/>元素
 driver.find_elment(By.XPath, "//*[@id='hotseach-content-wrapper']/li[last()-1]")

5. 简单条件计算
当某页面下有若干条排列元素或超链接,此时我们想定位后3条,而 [下标] 已经不能满足要求了,此时通过开发者工具分析,<li>元素都有一个属性data-index,它的值即是顺序号

driver.find_element(By.XPath,"//*[@id='hostsearch-content-wrapper']/li[@data-index>2]")

利用 “@属性名>目标值” 可以完成对元素属性值的筛选

driver.find_element(By.XPath,"//*[@id='hostsearch-content-wrapper']/li/a[span>2]")

上面代码其实是查找<li>元素下的超链接<a>元素,并且<a>元素必须拥有<span>元素且文本(text)值比2大。


6. 使用函数
XPath是一门编程语言,提供了丰富的函数可供开发者使用,比如下面例子:

driver.find_elment(By.XPath, '//input[contains(@autocomplete,"ff")]')
driver.find_elment(By.XPath, '//input[substring(@class,3)="ipt"]')
driver.find_elment(By.XPath, '//input[starts-with(@class,"s_")]')
driver.find_elment(By.XPath, '//*[@id="s-top-left"]/a[text()="新闻"]')
  • contains(),函数用于判断autocomplete属性是否包含ff;
  • substring(),函数用于将class属性的值从第3位进行截取,然后与ipt进行比较;
  • starts-with(),函数用于判断class属性是否以“s_”开头;
  • text(),函数用于获取文本内容并与“新闻”进行比较。

XPath语言强大功能超越了前七种元素定位方法,熟练使用XPath定位方法,可以完成绝大多数的元素定位工作,前提是认真学习掌握。XPath完全学习掌握可能有一定的困难,可以先使用其他定位方法,慢慢学习XPath定位方法。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐