2016-03-01 2 views
0

Я пишу тесты для веб-приложения, используя Selenium поверх Ruby, и у меня возникли проблемы.Остановить выполнение Javascript из блокирующего веб-сервера selenium

В моем автоматизированном тесте selenium webdriver нажимает на элемент, который, в свою очередь, выполняет некоторые Javascript.

Javascript создает окно предупреждения, которое я обычно принимаю с:

@IE.switch_to.alert.accept 

В этом случае, однако, управление не передается обратно в WebDriver и я не могу принять предупреждение.

Кажется, что Javascript по-прежнему выполняется - возможно, просто ждет принятия предупреждения.

Но поскольку для webdriver требуется, чтобы javascript завершил выполнение, прежде чем он сможет принять предупреждение, предупреждение не может быть принято, и javascript никогда не закончит выполнение.


У меня нет разрешения на изменение Javascript, так что исправление должно быть на стороне селена.

Есть ли способ, которым я могу выполнить Javascript, не заставляя webdriver ждать его?

---- UPDATE 1 -----

Как комментатор предложил запустить JavaScript в отдельном потоке позволило мне восстановить контроль с WebDriver: ********** ** НЕПРАВИЛЬНО - SEE UPDATE 2 *******************

Thread.new{ 
    button.press 
} 

к сожалению, я не могу справиться с тревогой, как я это обычно:

@IE.switch_to.alert 

^не работает

---- UPDATE 2 -----

Даже при запуске в потоке выполнение javascript по-прежнему блокирует дальнейшее выполнение webdriver.

Я использую Selenium Grid для выполнения тестов удаленно.

Из-за этого я не могу отправить нажатия клавиш или любой сигнал на удаленный компьютер, если этот метод не предоставлен удаленным webdriver, и поскольку webdriver заблокирован выполнением Javascript (даже если он запущен в отдельный поток). Я не могу связаться с удаленным компьютером после того, как выдается предупреждение.

Ближайшая идея, которую я имею для решения, похожа на то, что предложил Murali ниже, и переопределить методы javascript с теми, которые не возвращают предупреждения. Однако это очень далеко от идеала, методы javascript, которые я бы переопределял, многочисленны и сложны, некоторые из них - сотни строк.

Если у кого-нибудь есть что предложить по этому вопросу, это было бы чрезвычайно оценено, поскольку этот вопрос блокирует дальнейший прогресс в нашем проекте.

Спасибо!

+0

Запуск JS в отдельном потоке работал для меня в прошлом. Не знаю, рубин, но, возможно, это: http://www.tutorialspoint.com/ruby/ruby_multithreading.htm –

+0

спасибо: Thread.new { button.press } позволило передать управление обратно Webdriver. Однако мой обычный способ доступа к предупреждениям не работает в этом случае: @ IE.switch_to.alert Не похоже, что предупреждение существует. – Mundisoft

+0

К сожалению, webdriver заблокирован в одностороннем порядке при выполнении Javascript, поэтому, как только вызывается метод webdriver (который, случается, является частью кода, который обрабатывает предупреждение), скрипт не может прогрессировать. (даже если он запускается в отдельном потоке). – Mundisoft

ответ

1

Если вы знаете функцию, которая вызывает это предупреждение, вы можете попробовать с помощью javascript-исполнителя. что-то вроде ниже

((JavascriptExecutor)driver).executeScript("window.alert = function(msg){return true;};"); 

Спасибо, Murali

+0

Спасибо за совет, это не идеально. На моих тестах много таких случаев, и я ищу универсальное решение, которое можно вызвать в каждом таком случае. – Mundisoft

Смежные вопросы