Может ли JavaScript общаться с Selenium 2? - PullRequest
9 голосов
/ 08 апреля 2011

Я знаю, что могу заставить веб-драйвер Selenium 2 запускать JavaScript и получать возвращаемые значения, но происходит так много асинхронного, что я хотел бы, чтобы JavaScript общался с Selenium, а не наоборот.Я провел некоторые поиски и не нашел ничего подобного.Люди просто обычно используют implicitly_wait?Похоже, что это потерпит неудачу, так как невозможно рассчитать все?Прекрасным примером может быть уведомление Selenium о завершении XHR или асинхронной анимации с неопределенным временем выполнения.

Возможно ли это?Мы используем Selenium 2 с Python на Saucelabs.

Ответы [ 4 ]

8 голосов
/ 13 апреля 2011

Вам следует обратиться к методу execute_async_script () (JavascriptExecutor.executeAsyncScript в Java, IJavaScriptExecutor.ExecuteAsyncScript () в .NET), который позволяет ожидать функцию обратного вызова. Функция обратного вызова автоматически добавляется в массив arguments в вашей функции JavaScript. Итак, предполагая, что у вас уже есть функция JavaScript на странице, которая ожидает желаемого условия, вы можете сделать что-то вроде следующего (код Java ниже, C # и код Python должны быть похожими):

String script = "var callback = arguments[arguments.length - 1];"
    + "callback(myJavaScriptFunctionThatWaitsUntilReady());";

driver.manage().timeouts().setScriptTimeout(15, TimeUnit.SECONDS);
((JavascriptExecutor)driver).executeAsyncScript(script);

Возможно, можно быть еще умнее и передать функцию обратного вызова непосредственно событию, которое возвращает правильные данные. Вы можете найти больше информации о функции executeAsyncScript () в проекте JavaDocs и найти пример кода для этого в дереве исходного кода проекта. В этом файле .

есть отличный пример ожидания завершения XHR.

Если это еще не доступно в версии привязок Python, доступных для использования с SauceLabs, я ожидаю, что она будет доступна в ближайшее время. По общему признанию, в некотором смысле это толкает «опрос на требуемое состояние» из вашего тестового примера в JavaScript, но это сделает ваш тест более читабельным.

3 голосов
/ 12 апреля 2011

Теоретически это возможно, но я бы посоветовал против этого.

В этом решении, вероятно, будет запущен некоторый jQuery, который устанавливает переменную в true, когда обработка JavaScript завершится.

Установите для selenium цикл до getEval до тех пор, пока эта переменная не станет true, а затем выполните что-то в Selenium.

Это будет соответствовать вашим требованиям, но это действительно плохая идея.Если по какой-то причине ваш jQuery не установит для переменной триггера значение true (или любое другое ожидаемое вами состояние), Selenium будет находиться там неопределенно долго.Вы могли бы установить очень длительный тайм-аут, но что может быть отличным от простого Selenium для выполнения getEval и ожидания появления определенного элемента?

Похоже, вы пытаетесь переоценить свое решениеи это принесет вам больше боли, в будущем будет очень мало дополнительных преимуществ.

2 голосов
/ 09 апреля 2011

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

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

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

1 голос
/ 17 апреля 2013

Тестирование анимации с селеном открывает червячную банку. Тесты могут быть довольно хрупкими и вызывать много ложных срабатываний.

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

По моему опыту, асинхронный вызов может быть настолько быстрым, что счетчик никогда не отображается, и состояние страницы может полностью пропустить состояние (которое может обнаружить Selenium).

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

Я рекомендую ручное тестирование для анимации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...