我在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?
我似乎无法弄清楚我做错了什么,我们将不胜感激。
答案 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
)将在执行操作之前自动等待元素存在。