Почему 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 трудно узнать, когда страница будет загружена.
Что происходит в вашем сценарии:
- Введено поле поиска и нажата кнопка
- Начинается загрузка результатов поиска
- Watir считает, что страница закончила загрузку
- Утверждение запускается, что не удается, так как страница не закончила загрузку результатов.
- Страница фактически завершает загрузку.
Когда вы делаете это вручную через 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
это "поиск", вы всегда получите истину, так как ссылки внизу имеют это слово. Но на самом деле вы хотели посмотреть, было ли это в результатах поиска.