【问题标题】:Element not clickable when using FindElement on another WebElement在另一个 WebElement 上使用 FindElement 时元素不可点击
【发布时间】:2021-01-22 19:18:43
【问题描述】:

我有一个奇怪的问题:

当我通过以下方式定位元素时:

WebElement e1 = driver.findElement(By.xpath("//div1"));
WebElement e2 = e1.findElement(By.xpath("//.[@class='c2']"));
e2.click();

我无法点击 e2,因为:“元素 无法滚动到视图中。”

但是当我通过以下方式找到 e2 时:

WebElement e2 = driver.findElement(By.xpath("//div1//.[@class='c2']"));
e2.click();

它有效。 (同样检查e2.getLocation()时坐标不同,仅在第二个sn-p中正确)。

我认为 Selenium 不喜欢“//.”,因为:

WebElement e1 = driver.findElement(By.xpath("//div1"));
WebElement e2 = e1.findElement(By.xpath("div[@class='c2']"));
e2.click();

也可以。

知道如何在那里使用任何 (.) 选择器吗? (.[@class='c2']找不到)

[编辑] 我已经有了 e1,因此需要通过 e1.findElement(...) 搜索这个元素

【问题讨论】:

  • 点是选择当前节点。 // 表示路径中的任何位置。因此,我认为使用//. 是错误的。相反,请尝试使用单个斜杠 //div1/.[@class='c2']。我认为这应该可行。
  • @hfontanez 这当然可以在一个语句中使用它,问题是我已经有 e1 并且只能在其中搜索。不幸的是,e1.findElement("/.[@class='c2']") 没有产生任何元素
  • 我想让你明白为什么//. 不起作用。既然你已经有了 web 元素,使用 dot 来引用它是没有意义的。与其试图找出谁使用点选择器来解决这个特定问题,不如试着找出解决方案,而不管最终的 Xpath 表达式是什么样的。
  • “类”或样式可能是共享的......所以你可能会在那里得到两个不同的网络元素。一个有效的有一个更定义的基于路径的选择器。那里不需要两行,只需为您要定位的元素创建一个 XPATH。

标签: java selenium xpath


【解决方案1】:
WebElement e2 = e1.findElement(By.xpath("//.[@class='c2']"));

这与查找元素相同driver.findElement(By.xpath("//.[@class='c2']"));

因为你没有给出当前节点作为参考

你应该使用:

   e1.findElement(By.xpath(".//*[@class='c2']"));

见“。”在 // 前面,这意味着当前或引用节点是父节点,如果你只使用“//”而不是“//”,它将从根目录搜索

【讨论】:

  • 啊,好吧,我一直认为另一个元素上的FindElement 总是将上下文更改为该元素。感谢您的澄清!
  • 很好的答案。我还要警告使用星号,因为如果当前路径中的多个元素满足该标准,它可能会发生故障。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-08
  • 2018-08-02
  • 2015-01-18
  • 2019-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多