简洁的Xpath来模拟查找元素而不管页面结构如何? (硒)

时间:2017-09-04 15:45:08

标签: selenium xpath

如果您在视觉上查看网页并且页面上有可点击且唯一的内容,您只需点击它即可。不考虑页面结构。

我很想知道可以构建哪种最简洁的xpath来以多种方式模拟它。

例如,定位Google主页上的“我感觉很幸运”按钮:

//*[contains(@*, 'Lucky')]

以上作品。但是,如果包含Lucky作为内部文本,或者如果指定了错误的案例,则会失败。因此,我们的xpath需要满足任何灵敏度,并且还要查找匹配内部文本的给定字符串。

上面的xpath如何用最简洁但又包含在内的结构来表达?

2 个答案:

答案 0 :(得分:0)

没有什么是非常通用的,并且执行这样的xpath有时也会成本高昂。

"//*[contains(@*, 'Lucky')] | //*[contains(text(), 'Lucky')]"

上面是一个xpath,你可以结合起来得到一些结果。您开始指定不要检查的节点或要检查的节点

"//*[contains(@*, 'Lucky')] | //*[contains(text(), 'Lucky')][not(self::script|self::td)]"

你可以继续改进

答案 1 :(得分:0)

无法创建通用XPath 来准确/可靠地按文本定位元素。

为什么?

  • 因为不需要在页面中呈现由XPath评估的文本。
  • 因为每个祖先都包含预期的文字,因此很有可能以多个匹配结束。
  • 但主要是因为需要考虑的规则/具体案例太多。

但如果我必须创建一个,那么我将从这个开始:

"(html/body//*[not(self::script or self::style)][contains(concat(@value, normalize-space()), 'MyText')])[last()]"

获取<body>的所有后代

html/body//*

除了<script><style>

[not(self::script or self::style)]

value属性或规范化html包含'MyText'

[contains(concat(@value, normalize-space()), 'MyText')]

然后返回最后和最深的匹配

[last()]