Я пытаюсь запустить Selenium RC для выполнения автоматических тестов на моем веб-сайте. Я нахожу, что постоянно хочу проверить, что у меня не было никаких функций, и ручное тестирование начинает становиться утомительным.
Тем не менее, я не могу заставить Selenium RC работать с WaitForPageToLoad.
Я попытался скопировать основной пример, который они дают в документации на селен, но тест всегда застревает в: $ this-> waitForPageToLoad («30000»); Я вижу, что он так далеко выходит в появившемся окне и что страница выглядит правильно загруженной (мы находимся на странице результатов поиска Google). Но тест терпит неудачу с тайм-аутом.
require_once 'PHPUnit/Extensions/SeleniumTestCase.php'; /** * Description of Test * * @author brian */ class Test extends PHPUnit_Extensions_SeleniumTestCase { function setUp() { $this->setBrowser("*safari"); $this->setBrowserUrl("http://www.google.com/"); } function testMyTestCase() { $this->open("/"); $this->type("q", "selenium rc"); $this->click("btnG"); $this->waitForPageToLoad("30000"); $this->assertTrue($this->isTextPresent("Results * for selenium rc")); } }
Еще интереснее то, что если я обновляю страницу, когда она ждет, все будет продолжаться, как ожидалось. Таким образом, похоже, что waitForPageToLoad не понимает, что страница уже загружена.
Пример в документации Selenium RC устарел. Google изменил способ работы своей домашней страницы совсем недавно, и это уже не простая HTML-страница. Нажатие кнопки поиска теперь представляет собой операцию типа AJAX, которая отправляет запрос поиска и возвращает ответ JSON, который обрабатывается кодом JavaScript на странице. Таким образом, страница никогда не перезагружается, а WaitForPageToLoad () в конечном итоге истекает.
Есть еще одна возможная причина этой ситуации, с которой я столкнулся сейчас. Согласно документации , если вы вызываете ЛЮБЫЕ КОМАНДЫ waitForPageToLoad
между загрузкой страницы и вызовом waitForPageToLoad
, тогда возможно, что waitForPageToLoad
будет висеть. (Если я правильно понимаю, технически это условие гонки между тестовым сценарием и сервером селена, так что это происходит иногда, не обязательно все время).
В большинстве случаев загрузка страницы вызвана событием клика. Когда у вас есть тестовый скрипт, например:
$this->click("/some/path"); // <<- NO SELENIUM COMMANDS HERE $this->waitForPageToLoad("30000");
Убедитесь, что никакие команды селена случайно не вставлены в отмеченную область.
Хотя это технически не та же проблема, что и OP, она имеет такое же сообщение об ошибке, и я не мог найти эту информацию, не копаясь совсем немного. Надеюсь, это легче найти для других людей в будущем.
Я наблюдал такую же проблему много раз. Поэтому я не использовал эту команду, когда пользователь не перемещается с текущей страницы. Он зависает время от времени и использует IsElementPresent в цикле while и завершает работу после его возвращения true.
Атрибут для «WaitForPageToLoad ()« Подождать, пока элемент будет присутствовать.
$SECONDS = 360;
$SECONDS = 360;
for ($second = 0; ; $second++) { if ($second >= $SECONDS) $this->fail("TIMEOUT"); try { if ($this->isElementPresent("edit-submit")) break; } catch (Exception $e) {} sleep(1); }
Этот код будет зацикливаться на 360 секунд, проверяя, присутствует ли значение (edit-submit) каждую секунду. ( "Сон (1)"). По сути, он достигнет того же результата, что и WaitForPageToLoad, но вы можете указать абсолютную цель.