WebDriver API——元素定位

一、前言

把虫师的书看的差不多了,想直接开始项目实践,但好像有点操之过急了,还是一步一步来吧。WebDriver API是可以用来操作浏览器元素的一些类和方法,它提供了8种元素定位方法。下面将分别介绍下,本来想用公司网站做实践演练的,但考虑到公司对安全过于看重,就用百度来做演练了。

二、id定位

find_element_by_id()方法是通过id来定位元素的

find_element_by_id("kw") # 通过id定位百度输入框

三、name定位

find_element_by_name()方法是通过name来定位元素的

find_element_by_name("wd") # 通过name定位百度输入框

四、class定位

find_element_by_class_name()方法是通过class来定位元素的

find_element_by_class_name("s_ipt") # 通过class定位百度输入框

五、tag定位 

find_element_by_tag_name()方法是通过元素的标签名来定位元素的。用标签识别单个元素的概率很低,比如<input>用来定义输入框,<a>标签用来定义超链接等。

find_element_by_tag_name("input") # 通过标签名(tag name)定位百度输入框

六、link定位 

find_element_by_link_text()方法是通过元素标签对之间的文字信息来定位元素的

find_element_by_link_text("新闻") 

七、partial link定位

find_element_by_partial_link_text()方法是通过元素标签对之间的部分文字定位元素的

find_element_by_partial_link_text("非常") # 举例元素对之间的文字是“非常长的新闻”

八、XPath定位

1、绝对路径定位

不多扯了,这种不推荐,就是直接用工具生成绝对路径

2、利用元素属性定位 

find_element_by_xpath("//input[@id='kw']") # //input表示当前页面某个input标签,[@id='kw']表示这个元素的id值是kw
find_element_by_xpath("//*[@name='wd']") # 不指定标签名,可以直接用*号代替,这里通过name定位 
find_element_by_xpath("//*[@class='s_ipt']") # 通过class定位
find_element_by_xpath("//input[@autocomplete='off']") # xpath很强大,元素的任意属性值都可以用,只要它能唯一标识一个元素

3、层级与属性结合

如果元素本身没有可以唯一标识这个元素的属性值,但它的上一级元素有可以唯一标识属性的值,那就可以查找其上一级元素

find_element_by_xpath("//span[@class='bg s_ipt_wr']/input") # span[@class='bg s_ipt_wr']通过class定位到父元素,后面的/input表示父元素下面的子元素

如果父元素没有可以找的属性值,那可以继续向上找父元素的父元素

find_element_by_xpath("//form[@id='form']/span[2]/input")

4、使用逻辑运算符

find_element_by_xpath("//input[@id='kw' and @class='s_ipt']") # 适用于一个属性不能唯一区分一个元素的情况,and表示必须满足两个条件来定位元素

5、使用contains方法

contains方法用于匹配一个属性中包含的字符串。例如span标签的class属性为“bg s_ipt_wr”

find_element_by_xpath("//span[contains(@class,'s_ipt_wr')]/input")

6、使用text()方法

text()用于匹配显示文本信息

find_element_by_xpath("//a[text(),'新闻']")
find_element_by_xpath("//a[contains(text(),'非常')]") # contains和text()配合使用

九、CSS定位

css定位速度比xpath快,通过find_element_by_css_selector()方法用于在CSS中定位元素,xpath和css都提供了强大灵活的定位方法,相对而言,css语法更简洁,但理解和使用的难度要大一点

find_element_by_css_selector(".s_ipt") # .表示通过class定位
find_element_by_css_selector("#kw") # #表示通过id定位
find_element_by_css_selector("input") # 用标签名定位不需要任何符号标识,直接使用标签名
find_element_by_css_selector("span > input") # 通过标签层级关系定位,span表示父元素,查看span中所有标签名为input的子元素
find_element_by_css_selector("[autocomplete=off]") # 通过属性定位
find_element_by_css_selector("form.fm > span > input.s_ipt") # 组合定位,加强定位元素的唯一性
find_element_by_css_selector("[class*=s_ipt_wr]") # 查找class属性包含此字符串的元素
find_element_by_css_selector("[class^=bg]") # 查找class属性以此字符串开头的元素
find_element_by_css_selector("[class$=wrap]") # 查找class属性以此字符串结尾的元素
find_element_by_css_selector("form > input:nth-child(2)") # 查找form标签下面第2个Input标签的元素

  

原文地址:https://www.cnblogs.com/Chilam007/p/14730252.html