作者博客:
【第1部分】开篇:先了解Xpath的4种定位方法
我告诉你,你总是靠那种firebug,chrome的F12什么的右键复制xpath,总会有三天踩地雷找不到的情况。 这时候你就需要学会自己写xpath了,人脑永远比笔记本聪明,开始给我学习xpath句型吧!
第一种方式:通过绝对路径定位(相信你不会使用这些方法)
By.xpath(“html/body/div/form/input”)
By.xpath("//输入")
第二种方式:通过元素索引定位
By.xpath("//输入[4]")
第三种方式:使用xpath属性定位
By.xpath("//输入[@id='kw1']")
By.xpath("//输入[@type='name'和@name='kw1']")
第四种方式:使用部分属性值匹配(最强大的方式)
By.xpath("//输入[starts-with(@id,'nice')
By.xpath("//input[ends-with(@id,'非常漂亮')
By.xpath("//输入[包含(@id,'好漂亮')]")
【阐明】
starts-with 顾名思义,它匹配属性开头的关键字。
contains 匹配属性值中包含的字符串。
text() 匹配显示的文本信息,这里也可以用于定位。
【例子】
//input[starts-with(@name,'name1')] 查找name属性中起始位置包含关键字'name1'的页面元素
//input[contains(@name,'na')] 查找name属性中包含na关键字的页面元素
百度搜索,则xpath写为 //a[text()='百度搜索'] 或 //a[contains(text(),"百度搜索")]
【第二部分】我的一位同学在使用selenium定位时踩过的坑
上次有同学在定位元素时,使用火狐浏览器的firebug工具来定位HTML代码:
大概就是这样,死活无法确定位置,然后利用xpath属性和关键字的并列关系来定位。
//*[包含(@onclick, 'x64_3.01.3730.spkg') 和@name='delete']
【第三部分】切换iframe时遇到的几个鬼魂
(1)切换iframe时,有时iframe有丰富的id,因此可以直接定位并使用,但当iframe没有id信息时,如下图所示,
当然,实际情况中jquery同级元素选择器,会出现没有id属性、name属性为空的情况。 这时候就需要先定位iframe元素对象。 这里可以先用标签来定位,也可以达到同样的效果。
下面的代码:
iframe = 驱动程序。 按标签名称查找元素(“iframe”)
司机。 切换到框架(iframe)
切换后,可以正常定位iframe上面的元素,如driver.find_element_by_tagname(table),也可以使用xpath方法:例如Xpath=//*[contains(@src, 'sysmanage/systemupgrade.action ')]某种类型的。
(2)如果有多个iframe标签,那么你要查看总的iframe标签,看看你所针对的iframe元素是链表中的第一个iframe元素(从0开始,基于JavaScript),你可以使用chrome浏览器的F12控制台(Console)输入代码document.getElementsByTagName('iframe').length复制iframe的宽度(即数字),然后从0开始计数。
【下图可能有点大,看不到最左边的控制台,右键图片->在新窗口中打开】
(3)对iframe操作完成后,如果想返回主页面操作元素,可以使用switch_to_default_content()方法返回主页面。
下面的代码:
iframe = 驱动程序。 按标签名称查找元素(“iframe”)
司机。 切换到框架(iframe)
switch_to_default_content()
(4) 如何判断元素是否在iframe上?
1. 找到元件后,切换到firepath界面。
2.查看firebug工具左上角,如果显示Top Window,则说明没有iframe。
3、如果显示iframe#xxx,则表示在iframe上,#后面是它的id。
【第四部分】Selenium用javascript定位
因为selenium的核心引擎是由JavaScript驱动的,所以只要selenium自带的原始辣鸡方法出现无法定位、无法点击的并发症,一旦出现,就可以使用JavaScript。 除了 JavaScript 之外,还有 jQuery。 绝技技能,一一来,你被杀,他会来顶替,滔滔江水永不停歇。
1.下面总结了js定位的5种方式
除了id定位到单个元素元素对象外,其他所有元素都返回一个列表对象
1.通过id获取
文档。 getElementById("id")
2.通过名字获取
文档。 getElementsByName("名称")
返回的是列表
3.通过标签名称选择元素
document.getElementsByTagName(“标签”)
4.通过CLASS类选择元素
document.getElementsByClassName(“类”)
兼容性:IE8及以下版本浏览器未实现getElementsByClassName方法
5.通过CSS选择器选择元素
document.querySelectorAll("css 选择器")
兼容性:IE8及以下浏览器仅支持CSS2标准选择器句型
【示例代码】
js = 'document.getElementById("helloId").click();'
司机。 执行脚本(js)
js1 = 'document.getElementsByClassName("helloName")[0].value = "王大明";' //整个HTML文档中第一个使用CSS样式类的class="helloName"属性,其value属性值设置为“王大明”
司机。 执行脚本(js1)
【第五部分】Selenium使用jquery定位【逆天神惊,眼睛都瞪圆了】
JQuery 是一个诞生于 2006 年 1 月的基于封装 JavaScript 的框架。你经常会看到带括号 $('XXX') 的欧元符号,其实就是 document.getElementBy 的 js 方法。 至于XXX后面如果是.,则为document.getElementByClass,如果带#,则为document.getElementById。
【看不清图片,右键在新窗口打开图片】
1.身份证号
inputTest="$('#smart_input').val('帅哥,我又可以剪了')"
司机。 执行脚本(输入测试)
2. 班级
inputTest="$('.usersearch').val('帅哥,我又可以剪了')"
3.类型
inputTest="$(':text').val('帅哥,我又可以剪了')"
4. 层次结构
inputTest="$('#searchForm>#smart_input').val('帅哥,我又可以剪了')"
inputTest="$('#searchForm #smart_input').val('我又帅又可以剪了')" 【注意两个id选择器“#searchForm #smart_input”之间有一个空格]
inputTest="$('#searchForm>input:first').val('帅哥,我又可以剪了')"
选择最后一个输入元素:
clickbutton="$('#searchForm>input:last').click()"
选择前几个输入元素
inputTest="$('#searchForm>input:eq(0)').val('帅哥,我又可以剪了')" 从 0 数到第一个
inputTest="$('#searchForm>input:nth-child(1)').val('帅哥,我又可以剪了')" 当然,这也是可以的,nth-child算作第一个1
知识链接:
1. nth-child(N):下标从1开始; eq(N):下标从0开始;
2. nth-child(N):选择多个元素; eq(N):选择一个元素。
5、其他
#inputTest="$('input[name=query]').val('帅哥jquery同级元素选择器,我又可以剪了')"
inputTest="$('input[id=smart_input]').val('帅哥,我又可以剪了')"
-------------------------------------------------- -------------------------------------------------- ----------------------------
【附录1】xpath句型使用基础知识
如何使用 XPath:
示例1:html/body/div[1]/div[2](如果对html不熟悉,需要自行百度html。)
xpath的意思是:html标签下 -> body标签下 -> 第一个div标签下 -> 第二个div标签下
很好理解,继续
示例2:.//*[@id='content']/div[2]/ul
这样一来,有些人就会不明白了。//*[@id='content'] 是什么意思?
。 代表当前路径
a//b表示:a标签下的后代b标签
* 可以是任意标签
[@id='content'] 表示id为内容
所以:这个反例的意思是:在任何以 id 作为内容的子标签下面 -> 在第二个 div 标签下 -> ul 标签
学习完XPath的基础知识后,我们将开始进阶学习
//p[text()='a']:带有文本a的p标签
//p[text()='a']:文本包含a的p标签
//a[@class='abc']:class为a的p标签(当然。既然可以用@class,就必须用@id,为什么不把@src和@href关联起来呢?)
//p[not(@class='a')]:类不是a的p标签
好了,进阶完成了,如果想使用更高级的XPath,首先要对上面的内容进行属性化,然后与Selenium结合使用
Xpath与其他定位方式对比:(主要是与CSS定位对比)
XPath最大的用处就是能够向下搜索,但缺点就是速度太慢。
【附录2】CSS定位句型基础知识
CSS定位速度快,功能多,但不能向下搜索。 它比xpath更容易使用,并且执行效率比xpath更快。 我做过两种定位对比测速,我认为是最好的定位方法。
一般使用总结:
下面是精华
1. *:checked 选择*的checked元素
2. li.refined.list.group.item(如果类中间有空格,可以全部写.+.+.,也可以只写任意一个)
.checkbox[type^='check'][onclick*='Bebe'][checked$='ed'] +a
(开头 ^= 包含 *= 结尾 $= ) +a 是选择同级的前一个a
3. li a :选择li标签的后代a
5. li>a :选择li标签的子元素a
4. li, a : 选择li和a
5. li +a :选择下一个与li同级的a
6. li ~a :选择li同级以下的所有a
7. li>a:last-child /li>a:last-of-type : 选择li下的第一个a
8. li:not([class*='_']) : li 中的 calss 不包含 '_'
li:not(:nth-of-type(1)) :除第一个 li 之外的所有 li
9. li>a:nth-child(n)/li>a:nth-of-type(n):选择li下的第n个a
li>a:nth-last-child(n)/li>a:nth-last-of-type(n):选择li,最后第n个a
如果 n = odd 表示质数
如果 n = 偶数表示质数
div h2:nth-child(n) :当div的第n个子元素为h2时
div h2:nth-of-type(n):div下的第n个h2子元素
10. div[style]:div包含属性style
11. li>a:only-child : li下只有一个a标签
感谢这两位博主的三篇文章作为参考:
最后感谢Yoyo大师的开导!