Хорошо. Кажется, проблема решена - рабочее решение см. Ниже.
ПРОБЛЕМА => Осторожно с явным таймаутом Selenium против неявного тайм-аута. Я использую Browserstack для удаленного тестирования IE через Selenium Ruby Bindings, выполняя тесты через RSpec.
Элементы, которые я запрашиваю, - это рекламные блоки Google, я хочу быть уверенным, что мы показываем рекламу на всех наших платформах. Загрузка асинхронная, поэтому я жду загрузки страницы.
Когда я вручную вбиваю селен из оболочки ruby (irb), я всегда могу найти элементы в IE версий 9, 10, 11. То же самое, когда я вручную перехожу на сайт в режиме «Live» в режиме эмуляции IE в браузере.
НО - когда я запускаю те же команды, что и в оболочке программно, через RSpec, мои тесты терпят неудачу примерно в 50% случаев. IE 11 - самый тяжелый удар, проваливший большинство тестов. IE 10, как правило, работает немного лучше.
Те же тесты для Firefox + Chrome проходят.
Зависимости:
ruby '2.3.0'
gem 'selenium-webdriver'
gem 'rspec'
gem 'curb', '~> 0.9.1'
Любые идеи?
describe "Testing example.com in production with ie." do
it "loads ads on home page" do
caps = Selenium::WebDriver::Remote::Capabilities.internet_explorer
caps["browser_version"] = "11.0"
caps["os"] = "WINDOWS"
caps["os_version"] = "8"
caps["resolution"] = "1024x768"
caps["browserstack.debug"] = "true"
driver = Selenium::WebDriver.for(:remote,
:url => "http://<my_username>:<my_pw>@hub.browserstack.com/wd/hub",
:desired_capabilities => caps)
driver.navigate.to "http://www.example.com"
wait = Selenium::WebDriver::Wait.new(:timeout => 5) # seconds
verify = []
begin #
wait.until do
verify = driver.find_elements(:css => "div[id^="google_ads"]")
end
ensure
driver.quit
end
expected_ad_count = 5
expect( verify.count ).to eq expected_ad_count
end
end
РЕШЕНИЕ => Явный блок ожидания не работал для IE. Решение состоит в том, чтобы после инициализации driver
настроить неявное ожидание следующим образом:
driver = Selenium::WebDriver.for(:remote,
:url => "http://<my_username>:<my_pw>@hub.browserstack.com/wd/hub",
:desired_capabilities => caps)
driver.manage.timeouts.implicit_wait = 5
driver.navigate.to "http://www.example.com"
begin #
verify = driver.find_elements(:css => "div[id^="google_ads"]")
ensure
driver.quit
end
expected_ad_count = 5
expect( verify.count ).to eq expected_ad_count
И - работает!