2010-09-06 4 views
1

Я пытаюсь запустить Selenium RC для выполнения некоторых автоматических тестов на моем сайте. Я нахожу, что постоянно хочу проверить, что у меня не было никаких функций, и ручное тестирование начинает становиться утомительным.Selenium RC WaitForPageToLoad Hangs

Однако, похоже, я не могу заставить 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 не понимает, что страница уже загружена.

ответ

5

Пример в документации Selenium RC устарел. Google изменил способ работы своей домашней страницы совсем недавно, и это уже не простая HTML-страница. Нажатие кнопки поиска теперь представляет собой операцию типа AJAX, которая отправляет запрос поиска и возвращает ответ JSON, который обрабатывается кодом JavaScript на странице. Таким образом, страница никогда не перезагружается, а WaitForPageToLoad() в конечном итоге истекает.

+0

Спасибо! Я не понимал, что это проблема. Я решил, что их пример будет актуальным. Сейчас все работает. – Brian

+0

Ничего себе! Спасибо, спасли меня много времени! – Soph

1

Есть еще одна возможная причина этой ситуации, с которой я столкнулся сейчас. Согласно documentation, если вы звоните ЛЮБЫЕ КОМАНДЫ СЕЛЕНА между загрузкой страницы и вызовом waitForPageToLoad, тогда возможно, что waitForPageToLoad будет висеть. (Если я правильно понимаю, технически это условие гонки между тестовым сценарием и сервером селена, так что это происходит иногда, не обязательно все время).

В большинстве случаев загрузка страницы вызвана событием клика. Если у вас есть тестовый сценарий, как:

$this->click("/some/path"); 
// <<- NO SELENIUM COMMANDS HERE 
$this->waitForPageToLoad("30000"); 

сделать дополнительно убедиться, что ни один селен не команды когда-либо случайно вставляется в выделенную область.

Хотя это не технически та же проблема, что и OP, она имеет такое же сообщение об ошибке, и я не мог найти эту информацию, не копаясь совсем немного. Надеюсь, это легче найти для других людей в будущем.

0

Я наблюдал такую ​​же проблему много раз. Поэтому я не использовал эту команду, когда пользователь не перемещается с текущей страницы. Он зависает время от времени и использует IsElementPresent в цикле while и завершает работу после его возвращения true.

0

Атрибут «WaitForPageToLoad()« Подождать, пока элемент будет присутствовать.


    $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 секунд, проверяя, если значение (редактирование подать) присутствует каждую секунду. ("Сон (1)"). По сути, он достигнет того же результата, что и WaitForPageToLoad, но вы можете указать абсолютную цель.

Смежные вопросы