![](/img/trans.png)
[英]Selenium - Error: The expression is not a legal expression for xpath
[英]Syntax error on selenium xpath expression
我正在构建一个selenium findElement by.xpath
表达式,非常复杂,似乎存在语法错误。
我真的不懂XML语言,所以我明显犯了错误,有人能告诉我哪里有错误吗? :)
谢谢!
我在网页上有一个项目列表,每个项目都有子项目,我想要一个特定的项目,我知道name
和subName
name
。
html代码类似于:
<table id="list_proj" class="table tablebas table-striped table-bordered">
<thead>
<tbody style="height:1em;overflow-y:scroll"></tbody>
<tbody style="height:1em;overflow-y:scroll"></tbody>
<tbody style="height:1em;overflow-y:scroll">
<tr class="caption">
<td class="app_name" style="background-color:#EFEFEF;" colspan="11">
<b>
<a href="?page=applications&mode=edit&app_id=3" style="padding-left:10px;" data-icon=""> Application SEVo</a>
</b>
</td>
</tr>
<tr class="data"></tr>
<tr class="data"></tr>
<tr class="data">
<td title="Pas de commentaire !" style="text-align:left">
<img alt="MCO" src="/colibri/images/corner-dots.gif"></img>
<a href="?page=projects&mode=view&project_id=9" style="padding-left:5px">MCO</a>
</td>
<td>0.50</td>
<td></td>
<td colspan="2">
</tr>
<tr class="data">
</tbody>
<tbody style="height:1em;overflow-y:scroll"></tbody>
</table>
我的xpath表达式:
driver.findElement(
By.xpath(
"((//a[contains(text(),'"+name+"')])[1]
.(ancestor::td[@class='caption'])[1]
.following-sibling::td[@class='data']
.descendant::(a[contains(text(),'"+subName+"')])[1])[1]"
));
对不起,这个烂摊子^^'
我不知道带有selenium的xPath,但我认为语法错误应该在下面的行中
.descendant::(a[contains(text(),'"+subName+"')])[1])[1]
应该
.descendant::(//a[contains(text(),'"+subName+"')])[1])[1]
? (注意“// a”)
它应该是这样的:
//a[contains(text(),'"+name+"')]/ancestor::tr[@class='caption']/following-sibling::tr[@class='data']//a[contains(text(),'"+subName+"')]
不要每次都使用index
[1]
,如果你确定只返回一个元素,那么就没有必要在每个后代或祖先调用中放入索引。
使用xPath
下方哪个更好: -
//a[contains(.,'"+name+"')]/ancestor::tr/following::a[contains(.,'"+subName+"')]
for eg. :- //a[contains(.,'Application SEVo')]/ancestor::tr/following::a[contains(.,'MCO')]
更新..
另一个是: -
//a[contains(.,'"+name+"')]/following::a[contains(.,'"+subName+"')]
希望它会帮助你.. :)
"((//a[contains(text(),'"+name+"')])[1]
.(ancestor::td[@class='caption'])[1]
.following-sibling::td[@class='data']
.descendant::(a[contains(text(),'"+subName+"')])[1])[1]"
这有很多错误,很难知道从哪里开始。 首先,我们不知道变量名称和子名称中的内容 - 如果这些字符串包含单引号,则可能发生任何事情(注入攻击)。 其次,它似乎在使用“。” 作为路径中的步骤之间的分隔符,它应该使用“/”。 第三,像“descendant ::”这样的轴后面的内容必须是NodeTest,并排除括号表达式。
我认为你的方法存在一个真正的问题。 用你不理解的语言写一个复杂的表达式然后询问语法错误意味着什么并不是一个很好的进步方式。 (一旦你摆脱了语法错误,你会知道XPath实际意味着什么吗?)。 做一些阅读并正确学习语言; 不参加驾驶课程,不要试驾车。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.