состояние гонки в Selenium waitForPageToLoad? - PullRequest
3 голосов
/ 06 июля 2010

Мы используем Selenium для тестирования дыма на сайте Java Spring MVC. Мы вызываем его с помощью JUnit и клиента Java Selenium. В большинстве случаев наши тесты работают нормально, но мы склонны получать тайм-ауты в selenium.waitForPageToLoad в случайных местах. (То есть, запустите набор тестов несколько раз, и расположение и количество таймаутов будут сильно различаться.)

Запустив его с сервером на переднем плане, я могу наблюдать за выполнением тестов. Когда происходит одно из этих тайм-аутов, произошел selenium.click, предшествующий ожиданию, но ожидание не замечает. Щелкните правой кнопкой мыши на странице и выберите «Обновить», чтобы снять блокировку.

Для меня это говорит о том, что между щелчком и waitForPageToLoad возникает состояние гонки. Другие имеют проблемы с waitForPageToLoad, но не описывают состояние гонки. Некоторые предложили проблемы с предыдущим вызовом selenium.click, но я не вижу этого здесь. Кто-нибудь еще видел то, что я наблюдал?

Я видел несколько предложений не использовать waitForPageToLoad, но обходные пути часто предлагают использовать waitForElementPresent или вручную опрашивать наличие элементов. С нашим приложением, кажется, потребовалось бы снабдить HTML идентификаторами, которые будут использоваться только в тестах. Есть ли ненавязчивый способ обойти этот метод?

Ответы [ 4 ]

1 голос
/ 28 марта 2013

Я недавно столкнулся с этой проблемой.В моем случае window.location был заменен на якорь (например, window.location = "#myAnchor") почти сразу после загрузки страницы.Возможно, это изменение URL заставило waitForPageToLoad думать, что загруженная страница не является ожидаемой, и, следовательно, в конечном итоге завершается ошибкой.

Случайная часть проблемы была вызвана коротким (100 мс) «setTimeout», вызывающим это окно. Изменение местоположения.

Благодаря Selenium был обнаружен некрасивый код, который стал синхронным.

1 голос
/ 07 июля 2011

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

@ Росс, я согласен с твоим утверждением "копай глубже".Я также изначально думал, что это условие гонки, но в моем случае это был какой-то JavaScript, который работал довольно высоко на странице, и он делал что-то с сервером, который не был размещен нами, поэтому потребовалось больше времени, чем обычно, чтобызавершено, иногда.

Что я сделал, чтобы облегчить это, так это добавить дополнительное время между вызовами селена только для этой страницы и этим конкретным взаимодействием, используя команду селена set_speed(time_in_ms).

$self->{sel}->open_ok("/", $self->{browser});
# Inject 2000 ms in between selenium calls
$self->{sel}->set_speed("2000");

Затемустановите его обратно к тому, что мы обычно запускаем, 1000 мс.

1 голос
/ 10 сентября 2012

Я столкнулся с той же проблемой с Selenium RC 2.25 / Windows 7 / IE 9.

Два важных шага:

  • Вызов пакета Java из командной строки в контексте администратора (щелкните правой кнопкой мыши cmd.exe -> run as administrator)
  • Запустите Internet Explorer в режиме совместимости

Это решило проблему для меня.

1 голос
/ 09 июля 2010

Функция Selenium waitForPageToLoad() достаточно надежна - я не знаю, почему кто-то предложил бы вам не использовать ее. Это особенно хорошо работает в Firefox, где Selenium RC добавляет плагин, который помогает обнаруживать состояние готовности страницы, но он прекрасно работает и в Internet Explorer. Мы используем его несколько тысяч раз в нашем тестовом наборе, и он никогда не выходит из строя.

Вопрос, который вы должны задать: « Почему время ожидания моей страницы истекло? » На эту проблему лучше всего ответить, захватив сетевой трафик, участвующий в тесте, и проанализировав результаты в случае неудачи. Если у вас есть повторяемый контрольный пример, WireShark или Fiddler являются хорошими инструментами. Если нет, то вам может повезти, если вы используете метод Selenium RC captureNetworkTraffic() в обработчике исключений, чтобы сэкономить трафик при сбое.

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