9

如何手写xpath

  • 场景

通常情况下, 我们可以浏览器自带的定位方式, Firefox的F12, Chrome的开发者工具, 找到元素右键copy-copy xpath即可。

  • 基本语法

XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。 下面列出了最有用的路径表达式:

在下面的表格中,我们已列出了一些路径表达式以及表达式的结果:

  • 定位方式

绝对路径定位(直接copy浏览器xpath)

使用绝对路径的方式定位除非是其父级元素都没有一个唯一识别的元素才使用该方式;假如要定位到输入框,那么使用绝对路径的方式为:

xpath= /html/body/div/div/div/div/div/form/span/input

就是从根部开始找,一级一级往下走,如果有同级别的需要用[]标明序号,从1开

通过属性查找
  • xapth = //*[@id="wrap"]
  • xpath = //input[@id="wrap]
  • xpath = //input[@type="text"]
  • xpth = //input[@name="zs"]

//input表示要匹配所有的元素,//*表示匹配所有元素的标签

注意:要保证这些元素可以是唯一的标识

组合定位

如果input标签中 id不是唯一的,type也不是唯一的,但在该页面中包含该id和type的只有这个元素时,那么我们可以用组合的方式定位

  • xpath = //input[@id="wrap and @name="zs"]
找父级属性

如果自己没有唯一的标志,那么就找自己的上级(父级),或者上级的上级,以此类推。

  • 找父级:xpath=//span[@class="s_ipt_wr"]/input
  • 找父级的父级:xpath=//form[@id="form"]/span[1]/input
跳级

如果需要定位的元素在该页面不是唯一,但在某个容器内是唯一的,当然那个容器必须要有唯一的标志; 跳级的话要用两个//

谓语(Predicates)

谓语用来查找某个特定的节点或者包含某个指定的值的节点。

其他
  • contains: xpath =//input[contains(@id,"w")], 表示选择id中包含"w"的input节点
  • text(): xpath= //a[text()="地图"]. 由于一个节点的文本值不属于属性, ,所以,用text()函数来匹配节点
  • 特殊情况列举

1.列表有id属性

接着复制列表的xpath会有问题,需要个别分析,如下:

分析:可以看到列表li上面有id属性,所有就不能直接写xpath=//*[@id="line_u8_0"],需要找他的父级,可以有两种写法

  • xpath=/html/body/div[4]/div[2]/div[2]/ul "找到父级ul的xpath"
  • xpath=//*[@class="linsdd"]//li "手写xpath,通过找他父级的唯一标识,这里注意跳级了所以用的是//"
2.列表有其他无关元素参入

其他无关的元素也在其中不好取,附上地址可以练习一下。这里需要用到 position用来查找某个特定的节点或者包含某个指定的值的节点。如下:

分析:这里需要截取中间一部分,按这个页面举例,可以看到是重第三条table开始,到倒数3条table结束,才是真正的列表。要确保xpath精准,只有列表。

  • xpath=/html/body/table[position()>3 and position()<last()-3]
last() 选择最后一个,也就是倒数第一个
last()-1 选择倒数第二个
last()-2 选择倒数第三个
...依次类推
3.无法定位到正确列表,需要通过属性寻找

毫无规律,也找不到对应的class,id等等,分析发现这里看到他们的父级有valign属性,变并且有无关元入参入,这里需要用[@valign="top"]定位到元素,在配合截取,就完美解决了。

  • xpath=//td[@valign="top"]/table[position()>1 and position()<last()-2]//tr

江湖人称007
386 声望11 粉丝

作为一个真正的程序员,首先应该尊重编程,热爱你所写下的程序,他是你的伙伴,而不是工具。