Selenium测试超时不会停止测试PHPUnit 3.6.10 Selenium RC 2.19.0

时间:2012-02-15 10:41:00

标签: selenium timeout phpunit automated-tests selenium-rc

当测试尝试打开未加载的页面并且达到超时值时,测试不会停止或抛出异常。相反,它只是继续前进,就像页面加载成功一样。它在第一个返回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 个答案:

答案 0 :(得分: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.' );
    }
}

这似乎是非常不必要的,但此刻,它对我有用,但我仍然想要一个不需要这样的黑客的答案。