PHPUnit_Selenium:如果找不到元素,不要抛出异常?

时间:2013-02-25 13:49:38

标签: php testing selenium phpunit selenium-webdriver

我正在使用PHPUnit_Selenium扩展名,如果某个元素不存在,会遇到一些不需要的行为:

硒测试案例

$this->type('id=search', $searchTerm);

测试输出:

  

RuntimeException:在http:http访问Selenium Server时响应无效:   // localhost:4444 / selenium-server / driver /':错误:元素id =搜索不    结果

所以,我得到错误,但我想将其转换为失败而不是

我考虑过这个:

try {
    $this->type('id=search', $searchTerm);
} catch (RuntimeException $e) {
    $this->fail($e->getMessage());
}

但我真的不想将所有运行时异常转换为失败,也看不到区分它们的简洁方法。

另外一个断言会很棒,但我找不到符合我需要的断言。类似的东西:

$this->assertLocatorExists('id=search'); // ???
$this->type('id=search', $searchTerm);

我错过了什么吗?还是有其他方法我没想过?

已使用的版本:

  • PHPUnit 3.7.14
  • PHPUnit_Selenium 1.2.12
  • Selenium Server 2.30.0

3 个答案:

答案 0 :(得分:2)

为什么不这样做:

$ element = $ this-> byId('search');

//来自https://github.com/sebastianbergmann/phpunit-selenium/blob/master/Tests/Selenium2TestCaseTest.php

在java中(抱歉,我在Java中使用Selenium)如果找不到具有id搜索的元素,这将引发异常。我会查看文档,看看它是否与php中的行为相同。否则你可以尝试查看$元素是否有效,例如:is_null($ element)

答案 1 :(得分:2)

对于基于SeleniumTestCase的测试用例,我发现以下方法很有用:

getCssCount($cssSelector)
getXpathCount($xpath)
assertCssCount($cssSelector, $expectedCount)
assertXpathCount($xpath, $expectedCount)

对于基于Selenium2TestCase的测试用例,@Farlan建议的解决方案应该有效,以下方法检索一个元素并在没有找到元素的情况下抛出异常:

byCssSelector($value)
byClassName($value)
byId($value)
byName($value)
byXPath($value)

在我的情况下,测试来自SeleniumTestCase,因此问题中示例的解决方案是:

$this->assertCssCount('#search', 1);

答案 2 :(得分:1)

好吧,您可以检查catch块中的异常消息文本,如果它与Element id=search not found(或合适的正则表达式)不匹配,则重新抛出它。

try {
    $this->type('id=search', $searchTerm);
} catch (RuntimeException $e) {
    $msg = $e->getMessage();
    if(!preg_match('/Element id=[-_a-zA-Z0-9]+ not found/',$msg)) {
        throw new RuntimeException($msg);
    }
    $this->fail($msg);
}

不理想,但它可以解决问题。

我想这证明了为什么人们应该编写自定义异常类而不是重复使用标准异常类。

或者因为它是开源的,当然,您可以随时修改phpunit Selenium扩展,为其提供自定义异常类。