Selenium RC WaitForPageToLoad挂起

时间:2010-09-06 14:30:47

标签: php selenium selenium-rc

我正在努力让Selenium RC在我的网站上进行自动化测试。我发现我一直想验证我没有破坏任何功能,手动测试开始变得无聊。

但是,我似乎无法让Selenium RC与WaitForPageToLoad一起使用。

我尝试复制他们在selenium文档中提供的基本示例,但测试总是卡在:$ this-> waitForPageToLoad(“30000”);我可以看到它在窗口中显示的距离很远,并且页面似乎已正确加载(我们在谷歌搜索结果页面)。但测试失败并暂停。

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没有意识到页面已经加载了。

4 个答案:

答案 0 :(得分:5)

Selenium RC文档中的示例已过时。谷歌改变了他们的主页不久前的工作方式,它不再是一个简单的HTML页面。按搜索按钮现在是一个AJAX类型的操作,它发送搜索请求并获取由页面中的JavaScript代码处理的JSON响应。因此页面永远不会被重新加载,而WaitForPageToLoad()最终会超时。

答案 1 :(得分:1)

我刚刚遇到这种情况的另一个可能原因。根据{{​​3}},如果您在加载页面和调用waitForPageToLoad之间调用任意SELENIUM COMMANDS ,则waitForPageToLoad可能会挂起。 (如果我理解正确的话,从技术上讲,它在测试脚本和selenium服务器之间是竞争条件,所以它有时会发生,不一定总是发生。)

在大多数情况下,页面加载是由click事件引起的。当您有一个测试脚本时:

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

确保不会意外地将硒命令插入标记区域。

虽然这在技术上并不是OP发布的相同问题,但它有相同的错误信息,而且我无法找到这些信息而不需要花费很多时间。希望将来更容易找到其他人。

答案 2 :(得分:0)

我多次观察到同样的问题。因此,当用户没有离开当前页面时,我没有使用此命令。它有时会挂起并在while循环中使用IsElementPresent,并在返回true后退出。

答案 3 :(得分:0)

“WaitForPageToLoad()”的alernative是等待元素出现。


    $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相同的结果,但您可以指定绝对目标。