phpunit selenium2扩展中的显式等待

时间:2012-12-28 03:50:38

标签: php testing selenium phpunit selenium-webdriver

对于C#,有一种方法可以编写一个语句来等待页面上的元素出现:

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
IWebElement myDynamicElement = wait.Until<IWebElement>((d) =>
    {
        return d.FindElement(By.Id("someDynamicElement"));
    });

但有没有办法在phpunit的selenium扩展中做同样的事情?

注1

我唯一发现的是$this->timeouts()->implicitWait(),但显然这不是我想要的。

注2

这个问题是关于Selenium2和PHPUnit_Selenium2的扩展。

2 个答案:

答案 0 :(得分:8)

您找到的implicitWait是您可以使用的而不是waitForCondition。  正如WebDriver API(你也发现;)的规范说明:

  

implicit - 设置驱动程序在搜索元素时应等待的时间。搜索单个元素时,驱动程序应轮询页面,直到找到元素或超时到期,以先发生者为准。

例如,此代码最多等待30秒才能显示元素,然后再点击它:

public function testClick()
{
    $this->timeouts()->implicitWait(30000);
    $this->url('http://test/test.html');
    $elm = $this->clickOnElement('test');
}

缺点是它设置了会话的生命周期,并且可能会减慢其他测试的速度,除非它被设置为0。

答案 1 :(得分:1)

根据我的经验,从phpunit调试selenium测试用例非常困难,更不用说维护它们了。我在项目中使用的方法是使用Selenium IDE,将测试用例存储为.html文件,并且只能通过phpunit调用它们。如果有任何问题,我可以从IDE中进行午餐,然后调试就更容易了。 Selenium IDE有waitForElementPresent,waitForTextPresent和可能的其他一些方法,可以解决你的问题。如果您想尝试一下,可以在继承自Selenium Test Case类的类中使用此方法。

    $this->runSelenese("/path/to/test/case.html");