Capybara Selenium Переход к URL-адресу зависает с всплывающим предупреждением в Safari

В конце моих тестов Capybara автоматически переходит к «about:blank», чтобы настроить следующий тест. Иногда приложение, которое я тестирую, выдает всплывающее предупреждение, если пользователь покидает страницу (что ожидается). У меня есть код для обработки этого:

  begin
    page.driver.browser.navigate.to("about:blank")
    page.driver.browser.switch_to.alert.accept
  rescue Selenium::WebDriver::Error::NoAlertPresentError
    # No alert was present. Don't need to do anything
  end

Это отлично работает в Firefox, Chrome и IE. Но по какой-то причине в Safari команда навигации зависает, я полагаю, из-за всплывающего окна. Кто-нибудь знает обходной путь для этого?


person Kevin Smyth    schedule 28.02.2016    source источник


Ответы (2)


В настоящее время нет простого обходного пути для этой проблемы ни в одной из версий языковых привязок Selenium. Это известная проблема, в решении которой команда Selenium не заинтересована. По сути, это связано с архитектурой Safari и, следовательно, с архитектурой драйвера Safari.

JavaScript расширения драйвера Safari не знает о большинстве предупреждений, всплывающих окон и диалоговых окон, которые отображаются как модальные окна слоя Cocoa. Он также не может взаимодействовать с ними.

Способ есть, но он будет непростым, и никто его не делал.

Вам нужно будет использовать какао.

Поэтому в этом случае вы хотели бы использовать RubyCocoa. (или PyObjC, если вы использовали Python). Возможно, вам также понадобится дополнительное приложение, написанное на Objective-C. Хитрость заключается в том, чтобы использовать AX (API специальных возможностей) и отдельный процесс, чтобы наблюдать, есть ли предупреждение в виде переднего окна, и тыкать в его метки и текст кнопок, видимые для API AX. API-интерфейсы AX, вероятно, доступны в RubyCocoa через ScriptingBridge. Однако вам нужно будет добавить свое «приложение» в список вещей, которым разрешено управлять компьютером, на панели настроек безопасности.

При этом вы можете обнаружить окно и обработать его.

Он может быть довольно ненадежным на разных веб-сайтах, но если он построен правильно, вы сможете справиться с ожидаемыми условиями.

person uchuugaka    schedule 02.04.2016

Вы можете попробовать подтвердить это, что, я считаю, должно работать в разных браузерах.

# click ok to confirm
page.evaluate_script('window.confirm = function() { return true; }')
person MilesStanfield    schedule 29.02.2016
comment
Спасибо за предложение, но это не работает для этого случая :( Я могу либо запустить это перед командой навигации (которая ничего не делает, потому что предупреждение еще не существует), либо я могу запустить ее после команды навигации (которая так и не дошел, т.к. навигация зависает). - person Kevin Smyth; 29.02.2016