说到元素定位,不得不说一下Firefox的两个插件firepath和firebug。firepath主要是弥补selenium IDE有时候录制一些网页元素无法定位到的缺陷,帮助查找元素。firebug主要用于网页的元素定位,是强大的元素定位工具。不过,火狐在更新到57版本之后,对这些使用旧技术实现的插件都不再支持了,但也可以通过在浏览器查看元素。浏览器更新换代较快,大部分的网站采用较新的技术架构,用户也很少会使用太古老的浏览器版本,所以这里就不对firebug和firepath的使用操作做展示了。
元素的定位方法主要有以下七种:
一、find_element_by_id
id是最好的定位方式,使用id定位元素可以保证定位的唯一性。所有核心页面元素都添加ID属性,可以提高网页的可测试性。
driver.find_element_by_id('su') #定位id值为su的元素
二、find_element_by_name
name同样是好的定位方式,一般而言,那name也是唯一的,但是也有一些页面涉及多个类似功能按钮或者其他,name属性会重复使用相同的属性值。所以使用name前,最好是先用属性值在浏览器上查询当前页面是否存在多个相同的属性值,如果是唯一的,大可放心使用find_element_by_name这种定位方式。如果有多个,考虑其他属性定位或者用find_elements_by_name。使用find_elements最值得注意的是指定位置,正常情况下通过浏览器查找是知道准确的位置的,但也有特殊的时候,发现目标处于第三个位置,实际可能是第二个,碰到此类问题,多点调试,找到准确的。
三、find_element_by_className
className和id用法是一样的,但class很多时候都不是唯一的,class定义标签的样式,页面为了样式统一,所以一般会有多个class,这时还是要用find_elements定位。
driver.find_elements_by_className('btn')[2] #定位第2个‘class属性值为btn’的元素
class定位失败可能的原因:当classname 中存在空格的时候,直接使用find_element_by_class_name时,会显示定位失败,此时,需要将classname中的空格替换成英文的点“.”,如下图:
错误用法:find_element(By.CLASS_NAME,"table table-striped table-borderd table-hover dataTable no-footer")
正确用法:find_element(By.CLASS_NAME,"table.table-striped.table-borderd.table-hover.dataTable.no-footer")
四、link_text
find_element_by_link_text:全匹配
find_element_by_partial_link_text:关键词匹配
五、find_element_by_xpath
xpath (XML Path Language),是W3C定义的用来在XML文档中选择节点的语言,可以用来对页面元素层级与逻辑组合定位。xpath相对与css有较大的灵活性,既可以向前也可以向后搜索,但定位速度比css的稍慢。
//表示从匹配选择的当前节点开始选择文档中的节点,而不考虑它们的位置。
//input[2],2是索引号,根据该页面元素在页面中相同的标签名之间的索引位置进行定位。
模糊属性值定位:("//a[contains(text(), '新闻')]") //查找text中包含"新闻"的元素
("//input[starts-with(@id, 'k']") //查找id以"k"开头的元素
("//input[ends-with(@id, 'w']") //查找id以"w"结尾的元素
("//input[matchs(@id, 'k*']") //正则表达式查找元素
轴定位元素:
(//img[@alt=’div2-img2’]/parent::div) //基于img元素位置找到上一级的div
(//div[@id=’div1’]/child::img) //基于div找到下层节点中的img元素
文本定位元素:
(//a[contains(.,”百度”)]) //查找文本内容中含”百度”关键字的链接
(//span[.=”发送成功”]) //span标签是否含有“发送成功”的文本
六、find_element_by_tag_name
tag往往用来定义一类功能,所以通过tag识别某个元素的概率很低。任意打开一个页面,都会发现大量的<div>、<input>、<a>等tag,所以tag_name定位很少用。这种定位方式主要用于匹配多个页面元素的情况,将查找到的网页元素对象进行计算、遍历、修改属性等操作。
七、find_element_by_css_selector
css定位方式相对与xpath,定位速度会快些,不过在肉眼范围内,定位速度的差距并不明显,习惯性,本人基本不使用css对元素进行定位。css使用选择器来为页面元素绑定属性,可以灵活地选择控件的任意属性。
1 <input class="u-btn mart5" type="submit" οnclick="return User.check()" value="登录">
2 driver.find_element_by_css_selector(".u-btn.mart5").click()
以上就是七种主要的元素定位方法。
注:部分文章粉丝可见或自己可见。