Watir:元素存在但存在。返回假

时间:2019-07-17 10:16:51

标签: ruby-on-rails ruby watir

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

我需要检查带有<a>类的'src-routes-search-product-item-raw-style__descriptionTitle--8-vad'标记是否存在,是否存在,但是.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?

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

2 个答案:

答案 0 :(得分:1)

我想这是由于以下原因造成的:

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

2)或此处概述的一些细微差别:http://watir.com/staleness-changes/(也许您的代码触发了这种“怪异”行为:

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的源(无论将其安装在计算机上的位置)并打补丁(编辑)该方法,然后查看自己的状态。

答案 1 :(得分:1)

这是由于产品列表是异步加载的。结果,您会看到#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)将在执行操作之前自动等待元素存在。