PHPUnit + Selenium 2:对ajax加载的操作

时间:2013-07-23 07:40:08

标签: php ajax selenium phpunit automated-tests

在测试期间,我需要做以下事情:

  • 点击导致ajax请求的按钮,然后重定向
  • 检查用户是否已重定向到正确的页面

我的代码:

$this->byId('reg_email')->value('test@example.com');
$this->byId('reg_password')->value('seecret');
// No form here, so i can't just call submit()
// This click invokes ajax request
$this->byId('reg_submit')->click();

// Check page content (this page should appear after redirect)
$msg = $this->byCssSelector('h1')->text();
$this->assertEquals('Welcome!', $msg);

问题

  • 点击后立即进行消息检查,而不是在ajax请求和页面重定向之前

解决方案,我不喜欢:

  • 在内容检查前添加sleep(3);

我不喜欢它,因为:

  • 很傻
  • 如果回复快,我会浪费时间,如果请求很长,我会在ajax请求完成之前获得内容检查。

我想知道,有没有办法跟踪ajax请求+刷新并及时检查内容?

我的设置:

  • PHP 5.4,5.5也可用
  • PHPUnit 3.8
  • PHPUnit 1.3.1的Selenium RC集成
  • Selenium-server-standalone 2.33.0
  • Windows 7 x64
  • JRE 7

2 个答案:

答案 0 :(得分:10)

好的,有一种解决方案,我不是很喜欢它,但它不是什么都没有。

我们的想法是使用更智能的“睡眠”,有一种方法waitUntil(),它以毫秒为单位anonymous functiontimeout。做什么 - 在循环中运行此传递的函数,直到超时命中或函数返回True。所以你可以运行一些东西并等到上下文发生变化:

$this->waitUntil(function () {
    if ($this->byCssSelector('h1')) {
        return true;
    }
    return null;
}, 5000);

如果有人提供更好的解决方案,我仍然会很高兴。

答案 1 :(得分:0)

嗯,我不确定它对你有用,但你可以尝试使用它:

$this->timeouts()->implicitWait(20000);