2010-09-06 80 views
1

我想让Selenium RC启动并运行在我的网站上进行一些自动测试。我发现我经常想验证我没有破坏任何功能,手动测试开始变得令人厌烦。Selenium RC WaitForPageToLoad挂起

但是,我似乎无法让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文档中的示例已过时。谷歌改变了他们的主页在不久前的工作方式,它不再是一个简单的HTML页面。现在按下搜索按钮是一种AJAX类型的操作,它发送搜索请求并获取由页面中的JavaScript代码处理的JSON响应。所以页面永远不会被重新加载,并且WaitForPageToLoad()最终会超时。

+0

谢谢!我没有意识到这是问题所在。我认为他们的例子会是最新的。一切似乎都在工作。 – Brian 2010-09-08 00:30:25

+0

哇!谢谢,为我节省了很多时间! – Soph 2011-10-27 21:44:38

1

刚才我碰到这种情况还有另一个可能的原因。根据documentation,如果您在加载页面和调用waitForPageToLoad之间调用任何硒命令,那么waitForPageToLoad可能会挂起。 (如果我理解正确,它在技术上是测试脚本和硒服务器之间的竞争条件,所以它有时会发生,不一定总是这样)。

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

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

请确保没有硒命令不小心插入标记区域。

虽然这在技术上与OP发布的问题不同,但它具有相同的错误消息,而且如果不进行深入挖掘,则无法找到此信息。希望未来更容易找到其他人。

0

我多次观察到同样的问题。因此,当用户没有离开当前页面时,我没有使用这个命令。它有时会挂起,并在while循环中使用IsElementPresent,并在返回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相同的结果,但是您可以指定绝对目标。