我正在努力让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没有意识到页面已经加载了。
答案 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相同的结果,但您可以指定绝对目标。