Тайм-аут теста Selenium не останавливает тест PHPUnit 3.6.10 Selenium RC 2.19.0 - PullRequest
3 голосов
/ 15 февраля 2012

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

Я нашел это в журнале фиксации PHPUnit 3.6.10: https://github.com/sebastianbergmann/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

?>

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

1 Ответ

1 голос
/ 20 февраля 2012

Я собираюсь ответить самому себе, если у кого-то еще возникнет эта проблема. В качестве обходного пути я переопределяю функцию 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.' );
    }
}

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

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