Selenium中XPath按位置查找li元素失败原因咨询
为啥你的XPath按位置查找会失效?
嘿,这个坑我刚入行的时候也踩过!咱们先把核心差异说清楚——你用的两种XPath写法,逻辑其实完全不一样,这就是为啥一个生效一个报错。
最常见的两种位置写法差异
假设你说的第一种写法是//li[N],第二种是(//li)[N],那问题就出在括号上:
- 写法1:
//li[N]→ 它的逻辑是:在每个父节点下,找第N个li元素。不是全局第N个!如果页面里的13个li分散在不同的<ul>或<ol>里,每个父容器里的li数量都没到你指定的N,那自然找不到元素,报“未找到”错误。 - 写法2:
(//li)[N]→ 这个才是你想要的全局位置查找:先把页面上所有符合//li的元素全部捞出来,形成一个集合,再取这个集合里的第N个元素。这也是为啥它能正常工作,因为你的Driver确实能找到13个li,集合里有足够的元素。
举个直观例子
比如页面结构是这样的:
<ul class="menu"> <li>首页</li> <li>分类</li> </ul> <ul class="goods-list"> <li>商品1</li> <li>商品2</li> <li>商品3</li> </ul>
- 用
//li[3]:会分别去menu和goods-list里找第3个li。menu只有2个,找不到;goods-list里的第3个是「商品3」,所以只会返回这个(如果你的目标不是这个,就会报错)。 - 用
(//li)[3]:先把所有5个li列出来,取第3个,也就是「商品1」,这才是全局排序后的位置。
怎么让第一种写法生效?
如果你就是想用类似//li[N]的写法,那得限定父容器,确保你是在同一个父节点下找第N个li。比如你要找goods-list下的第3个li,就写成:
//ul[@class='goods-list']/li[3]
这样就不会跨父容器查找,逻辑更精准,也能避免找不到的问题。
内容的提问来源于stack exchange,提问作者Tjorriemorrie
相关产品推荐
相关产品推荐

