Я пишу тесты для веб-приложения, используя 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, которые я бы переопределял, многочисленны и сложны, некоторые из них - сотни строк.
Если у кого-нибудь есть что предложить по этому вопросу, это было бы чрезвычайно оценено, поскольку этот вопрос блокирует дальнейший прогресс в нашем проекте.
Спасибо!
Запуск JS в отдельном потоке работал для меня в прошлом. Не знаю, рубин, но, возможно, это: http://www.tutorialspoint.com/ruby/ruby_multithreading.htm –
спасибо: Thread.new { button.press } позволило передать управление обратно Webdriver. Однако мой обычный способ доступа к предупреждениям не работает в этом случае: @ IE.switch_to.alert Не похоже, что предупреждение существует. – Mundisoft
К сожалению, webdriver заблокирован в одностороннем порядке при выполнении Javascript, поэтому, как только вызывается метод webdriver (который, случается, является частью кода, который обрабатывает предупреждение), скрипт не может прогрессировать. (даже если он запускается в отдельном потоке). – Mundisoft