Browserstack тестирование IE, Selenium не находит загруженные элементы

Хорошо. Кажется, проблема решена - рабочее решение см. Ниже.

ПРОБЛЕМА => Осторожно с явным таймаутом 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

И - работает!


person Avi Fox-Rosen    schedule 04.03.2016    source источник


Ответы (1)


Согласно вашему тесту, я считаю, что ваш скрипт продолжит выполнение, даже если нет элементов, обнаруженных с помощью команды find_elements(:css => "div[id^="google_ads"]"). Это связано с тем, что явное ожидание ожидает только успешного выполнения команды, а нулевой ответ для команды поиска элементов считается успешным.

Я бы посоветовал вам заменить в тесте явное ожидание на неявное ожидание. Это поможет вам дождаться загрузки всех элементов в DOM, а затем продолжить выполнение теста. Вы можете использовать следующую команду в своем тесте, чтобы добавить неявное ожидание:

driver.manage.timeouts.implicit_wait = 5 # seconds

Кроме того, вы можете проверить, все ли объявления загружены на веб-страницу, с помощью команды JavaScript или jQuery. После завершения вы можете продолжить выполнение теста.

person Nishant    schedule 04.03.2016
comment
Спасибо за ответ - чем это отличается от ожидания, которое у меня уже есть? wait = Selenium::WebDriver::Wait.new(:timeout => 5) - person Avi Fox-Rosen; 05.03.2016
comment
хорошо - спасибо за редактирование - теперь это имеет смысл и работает. Отмечу выше! - person Avi Fox-Rosen; 07.03.2016