Selenium 不管页面结构如何,都可以使用简明的Xpath模拟查找元素?(硒)

Selenium 不管页面结构如何,都可以使用简明的Xpath模拟查找元素?(硒),selenium,xpath,Selenium,Xpath,如果你在视觉上看到一个网页,而该网页上有一些可点击且独特的东西,你只需点击它即可。不考虑页面结构 我感兴趣的是看看最简洁的xpath是什么,它可以被构造成以一种通用的方式来模拟它 例如,瞄准谷歌主页上的“我感觉很幸运”按钮: //*[contains(@*, 'Lucky')] 以上工作。但在包含Lucky作为内部文本的元素中失败,或者如果指定了错误的大小写。因此,我们的xpath需要满足任何敏感性,还需要查找与内部文本匹配的给定字符串 上面的xpath如何能够用最简洁但最包容的结构来表达?没

如果你在视觉上看到一个网页,而该网页上有一些可点击且独特的东西,你只需点击它即可。不考虑页面结构

我感兴趣的是看看最简洁的xpath是什么,它可以被构造成以一种通用的方式来模拟它

例如,瞄准谷歌主页上的“我感觉很幸运”按钮:

//*[contains(@*, 'Lucky')]
以上工作。但在包含Lucky作为内部文本的元素中失败,或者如果指定了错误的大小写。因此,我们的xpath需要满足任何敏感性,还需要查找与内部文本匹配的给定字符串


上面的xpath如何能够用最简洁但最包容的结构来表达?

没有什么是非常通用的,执行这样的xpath有时也会很昂贵

"//*[contains(@*, 'Lucky')] | //*[contains(text(), 'Lucky')]"
上面是一个xpath,您可以将其组合以获得一些结果。开始指定哪些节点不需要检查,哪些节点需要检查

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

而且您可以不断改进它

要通过文本准确/可靠地定位元素,不可能创建一个通用的XPath

为什么?

  • 因为不需要在页面中呈现XPath计算的文本
  • 因为每个祖先也包含预期的文本,所以很有可能以多个匹配结束
  • 但主要是因为有太多的规则/特定的案例需要考虑。
但如果我必须创建一个,那么我会从这个开始:

“(html/body/*[非(self::script或self::style)][包含(concat(@value,normalize-space(),'MyText'))])[last()
获取

除了

其中
属性或规范化html包含“MyText”

[contains(concat(@value, normalize-space()), 'MyText')]
然后返回最后一个也是最深的匹配

[last()]
//*[包含(,'Lucky')]请参见:SO的期望是,用户提出问题时不仅要进行研究以回答他们自己的问题,还要分享研究、代码尝试和结果。这表明你花了时间来帮助自己,它使我们避免重复显而易见的答案,最重要的是,它帮助你得到一个更具体和相关的答案!另见:
[contains(concat(@value, normalize-space()), 'MyText')]
[last()]