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
我可以使用其 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