Остановить выполнение Javascript от блокировки selenium webdriver

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

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

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

@IE.switch_to.alert.accept

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

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

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


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

Есть ли способ выполнить Javascript, не заставляя веб-драйвер ждать его?

----ОБНОВЛЕНИЕ 1-----

Как предложил комментатор, запуск javascript в отдельном потоке позволил мне восстановить контроль над веб-драйвером: ************ НЕПРАВИЛЬНО -- СМ. ОБНОВЛЕНИЕ 2 ************ ********

Thread.new{
  button.press
}

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

@IE.switch_to.alert

^ не работает

----ОБНОВЛЕНИЕ 2-----

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

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

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

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

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

Спасибо!


person Mundisoft    schedule 01.03.2016    source источник
comment
Раньше мне помогал запуск JS в отдельном потоке. Не знаю Ruby, но, возможно, это: tutorialspoint.com/ruby/ruby_multithreading.htm   -  person Andrew Regan    schedule 02.03.2016
comment
Спасибо: Thread.new{button.press} Разрешил передать управление обратно в Webdriver. Однако мой обычный способ доступа к оповещениям в этом случае не работает: @IE.switch_to.alert Похоже, что оповещение не распознается.   -  person Mundisoft    schedule 02.03.2016
comment
К сожалению, веб-драйвер блокируется в одностороннем порядке при выполнении Javascript, поэтому, как только вызывается метод веб-драйвера (который оказывается частью кода, обрабатывающего предупреждение), сценарий не может выполняться. (даже если он запускается в отдельном потоке).   -  person Mundisoft    schedule 19.07.2016


Ответы (1)


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

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

Спасибо, Мурали.

person murali selenium    schedule 02.03.2016
comment
Спасибо за совет, но это не идеально. В моих тестах было много таких случаев, и я ищу универсальное решение, которое можно вызывать в каждом таком случае. - person Mundisoft; 03.03.2016