Почему browser.text.include? .should == true не работает должным образом? возвращает неверное значение false -cucumber -watir webdriver -rspec

Ниже мой сценарий. Как указано в комментариях к коду ниже, когда я выполняю browser.text.include?(item).should == true от cmd prompt -> irb Я правильно понимаю значение true возвращается при поиске ожидаемого содержимого веб-страницы. Однако при выполнении в этом сценарии он не работает и возвращает значение false, Интересно, если я поменяю скрипт на browser.html.include?(item).should == true это работает как в скрипте, так и через командную строку. В чем проблема?

Я использую ruby ​​1.9.3 и драгоценные камни, перечисленные ниже. Любая помощь будет потрясающей! Спасибо!!

require 'watir-webdriver'
require 'rspec'
require 'rubygems'

Given(/^that I have gone to the Google page$/) do
  @browser = Watir::Browser.new :ff
  @browser.goto "http://www.google.com"
end

When(/^I add "(.*)" to the search box$/) do |item|
  @browser.text_field(:name => "q").set(item)
end

And(/^click the Search Button$/) do
  @browser.button(:name => "btnG").click
end

Then(/^"(.*)" should be mentioned in the results$/) do |item|
  @browser.text.include?(item).should == true
  #the line directly above works in cmd prompt -> irb -> and returns a value of true
  #but when executed from this script returns a value of false and shows up as failed in the
  #cucumber html report
  @browser.close
end

1 ответ

Решение

Вы сталкиваетесь с одной из проблем работы со страницами, которые используют много Ajax. Проблема с ajax заключается в том, что watir трудно узнать, когда страница будет загружена.

Что происходит в вашем сценарии:

  1. Введено поле поиска и нажата кнопка
  2. Начинается загрузка результатов поиска
  3. Watir считает, что страница закончила загрузку
  4. Утверждение запускается, что не удается, так как страница не закончила загрузку результатов.
  5. Страница фактически завершает загрузку.

Когда вы делаете это вручную через irb, вы, скорее всего, ждете достаточно долго между нажатием кнопки и проверкой результатов, что страница фактически завершает загрузку.

Если вы измените утверждение на puts @browser.text вы увидите, что текст страницы включает только заголовок страницы (различные ссылки). Если вы делаете что-то вроде sleep(5); puts @browser.text, вы увидите, что появляется текст, который вы ожидали.

Решение проблемы такого типа заключается в ожидании динамически загружаемого элемента. Хотя вы могли бы использовать sleepЭто плохой выбор, так как вы могли бы ждать дольше, чем нужно. Вместо этого используйте неявное ожидание, как описано на http://watirwebdriver.com/waiting/.

Следующий скрипт помог мне решить проблему с синхронизацией. В основном это ждет ol элемент, который содержит результаты поиска, чтобы появиться.

require 'watir-webdriver'
require 'rspec'

item = 'watir'

@browser = Watir::Browser.new :ff
@browser.goto "http://www.google.com"
@browser.text_field(:name => "q").set(item)
@browser.button(:name => "btnG").click
@browser.ol(:id => 'rso').wait_until_present
@browser.text.include?(item).should == true
@browser.close

Кроме того, обратите внимание, что вместо проверки, если item появляется в любом месте на @browser.textлучше проверять что-то конкретное - например, ожидаете ли вы этого в тексте ссылки, наборе результатов поиска и т. д. Проблема с проверкой в ​​любом месте заключается в том, что это может привести к ложным срабатываниям. Например, если item это "поиск", вы всегда получите истину, так как ссылки внизу имеют это слово. Но на самом деле вы хотели посмотреть, было ли это в результатах поиска.

Другие вопросы по тегам