Ruby on rails 瓦蒂尔:元素存在,但。存在吗?返回false

Ruby on rails 瓦蒂尔:元素存在,但。存在吗?返回false,ruby-on-rails,ruby,watir,Ruby On Rails,Ruby,Watir,我正在Rails项目中使用Watir来浏览以下页面: 我需要检查带有'src-routes-search-product-item-raw-style\uu descriptionTitle--8-vad'类的标记是否存在,它确实存在,但是?方法正在返回false b = Watir::Browser.new :chrome b.goto "https://icecat.biz/fr/search?keyword=3030050010763" p b.a(:class => "src-ro

我正在Rails项目中使用Watir来浏览以下页面:

我需要检查带有
'src-routes-search-product-item-raw-style\uu descriptionTitle--8-vad'
类的
标记是否存在,它确实存在,但是?方法正在返回
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
我用过。存在吗?方法来检查其他页面上是否存在某些元素,并且可以正常工作。例如,这将返回
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)
中存在一个bug?
(不确定您使用的是哪个版本),但很快发现:

2) 或者这里概述的一些细微差别:(可能是您的代码触发了这种“奇怪”的行为:

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)
中存在一个bug?
(不确定您使用的是哪个版本),但很快发现:

2) 或者这里概述的一些细微差别:(可能是您的代码触发了这种“奇怪”的行为:

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?
根据您运行它时的不同结果:

  • 如果您在访问页面后立即进行检查,而微调器仍然可见,
    #存在?
    为false
  • 如果等待产品列表加载,
    #存在?
    为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
)将自动等待元素存在,然后再执行操作。

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

  • 如果您在访问页面后立即进行检查,而微调器仍然可见,
    #存在?
    为false
  • 如果等待产品列表加载,
    #存在?
    为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
)将自动等待元素存在,然后再采取行动。

目标元素正在AJAX中。如果在调用
转到
后添加任意
sleep 5
语句/hack,
存在?
调用将返回
true。您需要轮询/等待元素。仅供参考:目标元素正在AJAX中。如果在调用
goto
后添加任意的
sleep 5
语句/hack,
存在?
调用将返回
true
。您需要轮询/等待元素。仅供参考:谢谢!我想是这样的
.exists?
也会等待元素存在,但现在有了意义。非常感谢!我原以为
.exists?
也会等待元素存在,但现在有了意义。感谢您的帮助,这与您的第二点有关-
。exists?
不会等待元素出现这就是为什么它可以在多次调用时返回不同的内容。感谢您的帮助,事实证明这与您的第二点有关-
。存在吗?
不会等到元素存在后再执行操作,因此它可以在多次调用时返回不同的内容。