xpath学习笔记
作者:YXN-python 阅读量:78 发布日期:2024-05-15
xpath语法
1.依靠自己的属性,文本定位
//td[text()='Data Import'] //div[contains(@class,'cux-rightArrowIcon-on')] //a[text()='马上注册'] //input[@type='radio' and @value='1'] 多条件 //span[@name='bruce'][text()='bruce1'][1] 多条件 //span[@id='bruce1' or text()='bruce2'] 找出多个 //span[text()='bruce1' and text()='bruce2'] 找出多个
2.依靠父节点定位
//div[@class='x-grid-col-name x-grid-cell-inner']/div //div[@id='dynamicGridTestInstanceformclearuxformdiv']/div //div[@id='test']/input
3.依靠子节点定位
//div[div[@id='navigation']] //div[div[@name='listType']] //div[p[@name='testname']]
4.混合型
//div[div[@name='listType']]//img //td[a//font[contains(text(),'seleleium2从零开始 视屏')]]//input[@type='checkbox'] 包含特定文本的字体元素内的复选框输入元素
5.进阶部分
//input[@id='123']/following-sibling::input 找下一个兄弟节点 //input[@id='123']/preceding-sibling::span上一个兄弟节点 //input[starts-with(@id,'123')] 以什么开头 //span[not(contains(text(),'xpath'))]不包含xpath字段的span
6.索引
//div/input[2] //div[@id='position']/span[3] //div[@id='position']/span[position()=3] //div[@id='position']/span[position()>3] //div[@id='position']/span[position()<3] //div[@id='position']/span[last()] //div[@id='position']/span[last()-1]
7.substring 截取判断
<div data-for="result" id="swfEveryCookieWrap"></div>
//*[substring(@id,4,5)='Every']/@id截取该属性 定位3,取长度5的字符 //*[substring(@id,4)='EveryCookieWrap']截取该属性从定位3 到最后的字符 //*[substring-before(@id,'C')='swfEvery']/@id 属性 'C'之前的字符匹配 //*[substring-after(@id,'C')='ookieWrap']/@id 属性'C之后的字符匹配
8.通配符*
//span[@*='bruce'] //*[@name='bruce']
9.轴
//div[span[text()='+++current node']]/parent::div 找父节点 //div[span[text()='+++current node']]/ancestor::div 找祖先节点
10.孙子节点
//div[span[text()='current note']]/descendant::div/span[text()='123'] //div[span[text()='current note']]//div/span[text()='123'] 两个表达的意思一样
11.following pre
//span[@class="fk fk_cur"]/../following::a 往下的所有a //span[@class="fk fk_cur"]/../preceding::a[1] 往上的所有a
xpath提取多个标签下的text
如果我有一百段这样类似的html代码,内部的标签不固定,又如何使用xpath表达式,以最快最方便的方式提取出来?
对于如下的代码:
<div id="test3">
我左青龙,
<span id="tiger">
右白虎,
<ul>上朱雀,
<li>下玄武。</li>
</ul>
老牛在当中,
</span>
龙头在胸口。
<div>
使用xpath的string(.)
data = selector.xpath('//div[@id="test3"]')
info = data.xpath('string(.)').extract()[0]
这样,就可以把“我左青龙,右白虎,上朱雀,下玄武。老牛在当中,龙头在胸口”整个句子提取出来,赋值给info变量。
模糊查询 contains
目前许多web框架,都是动态生成界面的元素id,因此在每次操作相同界面时,ID都是变化的,这样为自动化测试造成了一定的影响。
<div class="eleWrapper" title="请输入用户名">
<input type="text" class="textfield" name="ID9sLJQnkQyLGLhYShhlJ6gPzHLgvhpKpLzp2Tyh4hyb1b4pnvzxFR!-166749344!1357374592067" id="nt1357374592068" />
</div>
解决方法使用xpath的匹配功能,//input[contains(@id,'nt')]
测试使用的XML
<Root>
<Person ID="1001">
<Name lang="zh-cn">张城斌</Name>
<Email xmlns="www.quicklearn.cn">cbcye@live.com</Email>
<Blog>http://cbcye.cnblogs.com</Blog>
</Person>
<Person ID="1002">
<Name lang="en">Gary Zhang</Name>
<Email xmlns="www.quicklearn.cn">GaryZhang@cbcye.com</Email>
<Blog>http://www.quicklearn.cn</Blog>
</Person>
</Root>
查询所有Blog节点值中带有 cn 字符串的Person节点Xpath表达式:
/Root//Person[contains(Blog,'cn')]
2.查询所有Blog节点值中带有 cn 字符串并且属性ID值中有01的Person节点
Xpath表达式:
/Root//Person[contains(Blog,'cn') and contains(@ID,'01')]
YXN-python
2024-05-15