Тайм-аут теста Selenium не останавливает тест PHPUnit 3.6.10 Selenium RC 2.19.0

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

Я нашел это в журнале коммитов PHPUnit 3.6.10: phpunit/commit/cb772b06e9bd97f478fff7a212e3a4f7fe96bc29

В исходнике: https://github.com/sebastianbergmann/phpunit/blob/5d0ff52bdff9afd479e38fdc880adce453ce88e5/PHPUnit/Framework/TestResult.php#L665

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

Вот пример теста, чтобы спровоцировать поведение, о котором я говорю:

<?php
class Example extends PHPUnit_Extensions_SeleniumTestCase
{
    protected function setUp() {
        $this->setBrowser('*firefox');
        $this->setBrowserUrl('http://myserver/timeout.php');
        $this->setTimeout(10);
        $this->setWaitForPageToLoad(true);
    }

    public function testMyTestCase() {
        // This should trigger an exception after timeout:
        $this->openAndWait('/');

        // Anything below this line SHOULD never be executed because of timeout:
        $this->click('id=clicketyclickthiswontbeclicked');
        $this->click('id=moreclicksthatwillnotbeclicked');

        // This will fail the test, because timeout didn't stop it
        $this->assertTextPresent('this text');
    }
}
?>

Следующий файл PHP должен инициировать тайм-аут.

timeout.php:

<?php

// Should trigger timeout
sleep(30);

// (...) Rest of the page

?>

Я что-то не так делаю или это может быть баг?


person ohaal    schedule 15.02.2012    source источник


Ответы (1)


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

Вот код для него:

protected function waitForPageToLoad( $timeout=null ) {
    if ( is_null( $timeout ) ) {
        $timeout = 30000;
    }
    $start = time();
    parent::waitForPageToLoad( $timeout );
    $end = time();
    if ( ($end - $start) >= ($timeout / 1000) ) {
        throw new Exception( 'Timed out after '.$timeout.'ms.' );
    }
}

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

person ohaal    schedule 20.02.2012