具有OR条件的Xpath来标识元素

时间:2019-04-05 04:19:08

标签: xpath selenium-chromedriver

我正在尝试在网站中使用带有OR条件的Xpath来查找元素。没有语法错误,但未识别该元素。我无法弄清楚出了什么问题...?

一旦我们启动了网站,就会显示图片或链接,目标是单击可用的网站。

driver.findElement(By.xpath("//*[@id='nav-npm-footer']/div[1]/a/span or @id='multiasins-img-link']")).click();

应该点击图片或可用链接的代码

2 个答案:

答案 0 :(得分:0)

那不是有效的xpath-它是两个单独的xpath表达式,它们以“ or”串接:)

最好将链接和图像分开放置-每个都有自己的xpath,//*[@id='nav-npm-footer']/div[1]/a/span//*[@id='multiasins-img-link']。因此,您还将知道实际出现的是哪个,然后单击它-这可能是您还想测试的一项要求...

如果您仍然希望使用单个xpath进行操作,那就更接近了:

//*[@id='multiasins-img-link' or (ancestor::*[@id='nav-npm-footer']/div[1]/a and name()='span']

这将选择具有该ID的元素,或者选择一个名称为“ span”且在其祖先路径中具有该结构的元素-一个具有ID“ nav-npm-footer”的元素,然后是div,第一个元素有一个。请记住,“ span”不能是“ a”的直系子代,而可以是孙子或其他后代。

如果需要具体说明相对于这3个元素的跨度位置-应该这样做:

//*[@id='multiasins-img-link' or (name()='span' and ..[name()='a']/..[name()='div']/..[@id='nav-npm-footer'])]

我真的会使用两个xpath,而不是沿着这个^ rabbit洞:)

答案 1 :(得分:0)

无效的xpath。需要提供一种策略来处理此类情况,而不是仅使用xpath来解决此类情况。 理想情况下,您应该使用两个单独的xpath和一个策略来处理此问题。 尝试找出存在或存在并可见的交互对象,然后与之交互。 最好在不同的元素之间使用单独的xpath,并且在交互之前始终验证该元素是否可见并且可以交互。

如果您可以共享实际的HTML片段,那么我们可以共享一种更合适的方式来标识元素。