Watir:元素存在但.exists? returns 错误

Watir: element exists but .exists? returns false

我在 Rails 项目中使用 Watir 来抓取以下页面:https://icecat.biz/fr/search?keyword=3030050010763

我需要检查带有 'src-routes-search-product-item-raw-style__descriptionTitle--8-vad' class 的 <a> 标签是否存在,它确实存在,但是 .exists?方法正在返回 false.

b = Watir::Browser.new :chrome
b.goto "https://icecat.biz/fr/search?keyword=3030050010763"
p b.a(:class => "src-routes-search-product-item-raw-style__descriptionTitle--8-vad").exists?

我知道该元素存在,因为以下代码返回同一元素的 href 值:

b.a(:class => "src-routes-search-product-item-raw-style__descriptionTitle--8-vad").href

我用过.exists?检查其他页面上是否存在某些元素的方法,它工作正常。例如,这将返回 true:

b = Watir::Browser.new :chrome
b.goto "https://icecat.biz/fr/p/babyliss/bab5586e/hair+dryers-3030050010763-bab5586e-29245899.html"
p b.a(:data_type => "json").exists?

我似乎无法弄清楚我做错了什么,任何帮助将不胜感激。

我猜这是由于:

1) exists? 中的错误(不确定您使用的是哪个版本)但很快发现:https://github.com/watir/watir/commit/e036ffaa5d63e8c54c56c630ab7cba2f0bdce463

2) 或此处概述的一些细微差别:http://watir.com/staleness-changes/(也许您的代码会触发此 'weird' 行为:

it 'returns different responses when called more than once' do
  browser.goto(WatirSpec.url_for('forms_with_input_elements.html'))
  element = browser.text_field(id: 'new_user_email').tap(&:exists?)

  browser.refresh       # all elements become stale

  expect(element.present?).to be false
  expect(element.present?).to eq true
end

无论哪种方式,找出到底发生了什么的最好方法是转到 gem 的源代码(无论它安装在您机器上的哪个位置)并修补(编辑)该方法并查看你自己怎么回事。

这是因为产品列表是异步加载的。因此,您会看到 #exists? 根据您 运行 的不同结果:

  • 如果您在访问页面后立即查看,而微调器仍然可见,#exists? 将是 false
  • 如果您等待产品列表加载,#exists? 将是 true

加载页面后多次检查#exists?可以清楚地看到这一点:

b = Watir::Browser.new :chrome
b.goto "https://icecat.biz/fr/search?keyword=3030050010763"
5.times do
    p b.a(:class => "src-routes-search-product-item-raw-style__descriptionTitle--8-vad").exists?
end
#=> false
#=> false
#=> true
#=> true
#=> true

请注意,与元素交互的方法,例如 #href,将自动等待元素存在后再采取行动。