分享:selenium(一) xpath

xpath无所不能定位。  

https://www.w3.org/TR/xpath/all/#axes  

 两个神器:firebug、xpath-checker

 

举例:混合定位

  //td[a//front[contains(text(),"从零开始视频")]//input[@type='checkbox']

确认xpath是否是正确的:firefox==>F12==>控制台==》$x(".//*[@id='su']")
 

 

 

 第一部分:基础定位:

1。依靠自己属性,文本定位(当f元素的文本text(),属性@是唯一时用)

//td[text()='wangm']   #文本是唯一的td元素

//div[contains(@class,'cux-rightarrowicon-on')]    #class属性的值是唯一的div元素

//input[@type='radio' and @value='1']   #两个属性一起确定一个元素

 

2。依靠父节点定位(当子节点没有唯一可定位的属性,但它的父节点却有唯一的属性时用)

 //div[@class='wangm']/div

//div[@id='wangm']/div

// div[@id='testid']/input

 

 

3。 依靠子节点定位(当父节点没有唯一定位的属性,但它的子节点有确定的值或者有确定的组合时)   

//div[div[@id='wangm']]   #中括号是用来描述父子关系的。

//div[div[@name='wangm']] 

//div[p[@name='testp']] 

 

 

4。 混合型(实际应用中复杂些)

//div[div[@name='listType']]/img    #先用name属性找到子节点div,定位其父div,找的是父div下的img元素。

 

 

 

第二部分:进阶定位:

兄弟姐妹节点 

following-sibling   #后面的兄妹节点

preceding-sibling  #

 

starts-with  #以什么内容开头  语法与contains一样。

contains   #包含什么内容

not 

 

 

//input[@id='1234'] /following-sibling::input   #后面的兄妹input节点

//input[@id='1234'] /preceding-sibling::span   #前面的兄妹sapn 节点

//input[starts-with(@id,123')]   #以123开头的Id属性的内容的input元素。

//span[not(contains(text(),'xpath'))]   #寻找text内容不包含xpath的span元素。

 

 

 

补充整理:

绝对路径 :html/body/div/span[2]/input[4]   中间结构变化,就失效

相对路径: //开始  在整个html source里找,不管在什么位置

 

索 引:[x]   从1开始,而不是从0开始     如://div/input[2]  #div下面第2个input

                                                     误解://span[28]   #一个页面上虽然有28个span,但只有放在同一个根节点下才是span[28]能定位到。   

 

关键字:position:索引也可以认为是一个position

             last: 同上

 

 

//div[@id='test']/span[position()=1]                ====      //div[@id='test']/span[1]

//div[@id='test']/span[position()<3]                 ====      //div[@id='test']/span[1]     //div[@id='test']/span[2]

//div[@id='test']/span[last()-1]                        ====      最后第二个

//div[@id='test']/span[last()-2]                        ====      最后第三个

 

 

属性定位:  @class 

 

功能关键字: 

        常用的:  and / [][] ,  or,  not, contains, starts-with(无end-with)

                     and    #多个属性共同定位一个元素    //span[@name='wangm' and text()='wangm']    ==== //span[@name='wangm'][text()='wangm']

                     or      #符合一个属性的就可以定位出来   例子同上。

 

        不常用的: substring,subsring-before , substring-after

         substring : 一个属性的值,一部分是固定的,而另一部分是变化的,此时用。且从1开始。   //span[substtring(@name,3,5)=‘wangm’] 

                         三个参数(属性,开始位置,长度) ,长度不写时,表示取到最后。   如name='7-wangm-89'

         substring-before:  属性的值,一部分固定,一部分动态,且中间有分隔符    如 name='wangm-789'       //span[substtring-before(@name,'-')=‘wangm’] 

                         两个参数(属性,分隔符)

         substring-after: 同上     如 name='789-wangm'

 

 

通配符: *   代表所表

         //sapn[@*='wangm']   #span下任意属性等于wangm的

         //*[@*='wangm']     #任意的标签中任意的属性等于wangm的。    

 

 

Axes  轴

 ------描述查找范围的-----

parent  父节点                            如://div[span[text()='wangm']]/parent::div    #当前div的父节点div

ancestor   祖先节点,包括父节点,一层一层向上。    如:

descendant  所有子孙节点找,不管什么位置,简写//  

following-sibling   #当前元素后面的兄弟姐妹

preceding-sibling    #当前元素前面的兄弟姐妹

 

following  #当前元素后面的所有元素,不管是兄弟姐妹还是子孙后代,一直到</html>

preceding #当前元素前面的所有元素,不管是兄弟姐妹还是子孙后代,一直到<html>

 

ancestor-or-self      #祖先节点并包含自己

descendant-or-self    #子孙节点并包含自己

 

 

 

 如://div[span[text()='wangm']]/parent::div

 

 

如果定位不到,可以在浏览器的F12的控制台中的consle中验证,如下格式。

$x('//*[@id="hotsearch-content-wrapper"]/li[2]/a/span[2]')

 

实战:

 

如果定位到好几个无素,从中找最后一个元素,用[last()] 怎么都不管用,最后沉下心来,自己写,并参考以下XPATH的基本语法:

https://www.cnblogs.com/wendyw/p/11633588.html

原来取不到最后一个的:$x('//input[@placeholder="请请输入品牌型号"][last()]')  用这个定位到三个,用last()取最后一个却怎么也取不到。

改进后的:  $x('//div/form//div[text()="序号"]/following::input[@placeholder="请输入品牌型号"][last()]')

改进思路: 先找个特殊的标记,比如整个页面的table很多,input也很多,但序号这个是整个页面上唯一的,我就先定位序号,然后找他后面的请输入品牌型号的input, 然后用last()就管用了。

 

 

查看日志:

/home/project/log/pc-jc-tch-2024

tail -1000f log.log

 

 

 

20241125 最近发现一直运行稳定的开机报名监控程序,最近登陆不进去了,验证码取不对,总出错,即在 selenium 中定位元素后使用 loction 获取坐标值出现偏差,导致未能截取到指定验证码图片

原因:之所以会出现这个坐标偏差是因为windows系统下电脑设置的显示缩放比例造成的,location获取的坐标是按显示100%时得到的坐标,但我们的电脑缩放比例并不是100,因此就出现了偏差。

 解决方法:把电脑的显示缩放设置调回100%即可准确定位

以win10的系统为例,到桌面点击右键->显示设置->高级缩放设置->自定义缩放(100%),(之后可能需要注销重启电脑,大部分不需要),然后就可以了

参考链接:https://blog.csdn.net/weixin_42277380/article/details/136375860

posted @ 2018-08-24 15:09  yoyoma0355  阅读(467)  评论(0)    收藏  举报