Watir 通过 xpath 查找元素,而不是通过 id 或 class

Watir finds element by xpath, but not by id or class

我可以使用其 XPath 找到一个元素,但不能使用其 ID、class 或文本。我不想使用 XPath,因为我知道它很容易损坏。

这是它的样子:

$browser.div(:xpath => "/html/body/nav/div[1]/div/div[3]/div/div/div[3]/div/div/div[2]/div[1]/div/div[2]/div[2]/div[1]/div[2]/div/div/div").present?
$browser.div(:xpath => "/html/body/nav/div[1]/div/div[3]/div/div/div[3]/div/div/div[2]/div[1]/div/div[2]/div[2]/div[1]/div[2]/div/div/div").click

它 returns 正确并点击该元素。

按照路径,找到元素,然后尝试使用它的 ID,例如:

$browser.div(:id => "PaymentSelector").present?
$browser.div(:id => "PaymentSelector").click

它 returns 错误并且尝试点击超时。文本或 class.

也会发生同样的情况

该元素不在框架或 iframe 内。

为什么会发生这种情况,我该如何解决?

正如评论中所讨论的,问题在于存在多个具有相同 id 的元素。这可以通过调用看到:

$browser.divs(:id => "PaymentSelector").count
#=> 5

Watir returns 第一个匹配元素,在本例中恰好是隐藏元素。它不是用户感兴趣的。您需要制作一个更具体的定位器,以便返回正确的元素。

一个选项是指定 :index,因为您现在知道它是第二个:

$browser.div(:id => "PaymentSelector", :index => 2).click

但是,使用 :visible 定位器找到第一个可见的可能会更可靠:

$browser.div(:id => "PaymentSelector", :visible => true).click