Python+Selenium+WebDriverAPI元素定位
元素定位
webdriver提供了八中元素定位的方法,在Python语言中,对应的方法如下:
1.id定位
find_element_by_id()
方法通过id属性定位元素
2. name定位
find_element_by_name()
方法通过name属性定位元素
3. class定位
find_element_by_class_name()
方法通过class属性定位元素
4. tag定位
htm的本质就是通过tag来定义实现不同的功能,每一个元素本质上也是一个tag。因为一个tag往往用来定义一类功能,所以通过tag识别某个元素的概率很低。例如我们打开任意一个页面,就会发现大量的<div>,<input>,<a>等tag,所以很难通过tag name去区分不同的元素
find_element_by_tag_name()
方法通过tag属性定位元素
5. link定位
find_element_by_link_text()
方法通过元素标签对之间的文本信息来定位元素
6. partial link 定位
partial link 定位是对link定位的一种补充,有些文本链接会比较长,这个时候我们可以选取文本链接的一部分定位,只要这一部分可以唯一的标识这个链接
<a class="test" name="test" href="#">这是一个很长很长很长的文本链接</a>
find_element_by_partial_link_text("一个很长很长的")
方法通过元素标签对之间的部分文本信息来定位元素
7. XPath定位
绝对路径定位
xpath绝对路径定位方法就是在html文本中,一级一级的往下找,如果一个层级下有多个相同的标签名,那么就按上下顺序确定是第几个【从1开始计数】
find_element_by_xpath("/html/body/div/div[2]/div/div/div/form/span[2]/input")
有关计数的路径表达式,以及表达式的结果:
利用元素属性定位
除了使用绝对路径之外,xpath也可以使用元素的属性值来定位。
例如:
find_element_by_xpath("//input[@id='kw']")
find_element_by_xpath("//*[@class='kw']")
find_element_by_xpath("//input[@name='kw']")
find_element_by_xpath("//*[@type='submit']")
含义解释如下图:
image.png
image.png
层级与属性结合
如果一个元素本身没有可以唯一标识这个元素的属性值,那么我们可以找其上一级元素,如果它的上一级元素有可以唯一标识的属性值,也可以拿来使用。
例如:
find_element_by_xpath("//span@[type='submit']/input")
使用逻辑运算符
如果一个属性不能唯一地区分一个元素,我们还可以使用逻辑运算符连接多个属性来查找元素
例如:
find_element_by_xpath("//span@[type='submit' and @class='su']/input/span[2]")
下面列出了可用在 XPath 表达式中的运算符:
8. CSS定位
CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明:
image.png
- 选择器通常是您需要改变样式的 HTML 元素。
- 每条声明由一个属性和一个值组成。
-
属性(property)是您希望设置的样式属性(style attribute)。每个属性有一个值。属性和值被冒号分开。
css选择器的常见语法
image.png
通过class属性定位
find_element_by_css_selector()
方法用于css语言定位元素,点号"."表示通过class属性来定位元素
例如:find_element_by_css_selector('.s_ip')
通过id属性定位
井号"#"表示通过id属性来定位元素
例如:find_element_by_css_selector('#kw')
标签名定位-通过父子关系定位
例如:find_element_by_css_selector('span>input')
上面的写法表示有父亲元素,它的标签名为span,查找它的所有子元素标签名=input的元素
标签名定位-通过属性定位
例如:find_element_by_css_selector('[name="kw"]')
在css中也可以使用元素的任意属性,只要这些属性可以唯一标识这个元素。对于属性值来说,可以加引号,也可以不加。
标签名定位-组合定位
我们可以把上面的定位策略组合起来使用,这就大大加强了定位元素的唯一性
例如:find_element_by_css_selector('form.fm>span>input#kw')
该篇文章转自虫师的《Selenium2 自动化测试实践 基于Python语言》中的第四章第一部分。