#selenium
#selenium
Вопрос:
Время от времени мои тесты selenium случайным образом завершаются ошибкой с сообщением об ошибке «элемент X не найден». Я делаю простой выбор по идентификатору, например.
click('sideBar_queryButton')
Когда я использую инспектор dom, элемент есть, поэтому мне интересно, почему selenium иногда его не находит. Когда я снова запускаю тот же тест, он работает или снова прерывается, кажется, нет надежного способа воспроизвести его. Кажется, что даже тесты, которые существуют целую вечность, случайным образом прерываются, а затем волшебным образом снова работают. Вставка нескольких инструкций sleep иногда помогает, но ненадежно. Поэтому мне интересно, использую ли я его неправильно. Были ли у кого-нибудь еще подобные проблемы с selenium, и если да, то как вы их исправили?
Комментарии:
1. Или они отображаются с использованием Javascript после загрузки страницы, selenium может довольно легко начать выполнение тестов на странице после ее загрузки, но до завершения обработки JavaScript.
2. Ну да, мы используем Ajax. И кнопки отображаются с помощью JS. Затем мы снова используем «waitForPageToLoad» в начале каждого теста и каждой части, которая загружает страницу, так что разве это не должно сработать?
3. Я так не думаю. waitForPageToLoad() не обслуживает вызовы ajax. Он просто проверяет read_state страницы. Даже если страница загружена, вызов ajax все еще выполняется в фоновом режиме. Лучшим решением было бы дождаться какого-нибудь элемента, который появится после вызова Ajax.
Ответ №1:
Редактировать: я обнаружил, что гораздо надежнее поместить некоторые тестовые маркеры на мои страницы и дождаться их появления. Если вы используете асинхронные операции, которые могут создавать условия гонки в ваших тестах, вставка тестового маркера в ваш html после завершения операции сработала для меня довольно хорошо. Например.
$('<div>').addClass("testMarker").append("OpXYZFinished").appendTo($('#content'));
Таким образом, вы можете выполнить простое «waitForTextPresent», чтобы увидеть, все ли получилось, и это намного надежнее, чем угадывать состояние загрузки браузера. Класс testmarker должен быть отформатирован таким образом, чтобы он не был виден пользователю (например, цвет шрифта == цвет фона).
Спасибо за все ваши комментарии. После некоторого более глубокого изучения сети и наших тестов я, наконец, обнаружил, что объединение этих инструкций вместо простого waitForPageToLoad является решением наших проблем:
waitForPageToLoad('') // wait until all ajax activity has ceased. That check's jQuery's $.active waitForCondition('selenium.browserbot.getUserWindow().$.active == 0', 5000) // wait a second for all JS to properly initialize pause(1000)
Там все еще есть пауза, которая несколько уродлива, но это так
хитрость.
Комментарии:
1. Примечание: если вам приходится прибегать к этому методу, возможно, было бы лучше вместо этого установить глобальную переменную JavaScript, чтобы она была «полностью невидимой».