PHPUnit + Selenium测试div是否有css类

时间:2014-07-23 23:50:17

标签: php selenium phpunit

问题

如何检查div是否具有PHPUnit和Selenium的特定css类或其他属性?

背景

我一直在使用PHPUnit和Selenium在许多站点上执行功能测试。测试目前正在扩展PHPUnit_Extensions_SeleniumTestCase,但如果它能提供更好的解决方案,我使用PHPUnit_Extensions_Selenium2TestCase没有问题。

测试示例

这是一个测试的例子,实际使用情况要复杂得多,测试类被抽象为我的测试用例扩展的几个子类。

在这个示例中,我希望能够单击一个按钮(some_button)并检查div(some_div)是否具有css类'active'。

class ExampleTest extends PHPUnit_Extensions_SeleniumTestCase {

protected $captureScreenshotOnFailure = true;

    public function setUp() {

        //Load some base application configuration and set $base_url

        $this->setBrowser('firefox');
        $this->setBrowserUrl($base_url);
    }

    public function testIfButtonChangesClass() {
        $this->open("/test_page");

        $this->select("id=some_combo", "value=2");
        $this->assertFalse($this->isVisible('id=some_button'));

        $this->click("id=some_button");

        //How do I test if some_div has the class active? it would be nice to do 
        //something like this?
        $this->assertTrue($this->hasClass('id=some_div','active'));

        }

    }


}

2 个答案:

答案 0 :(得分:1)

最简单的方法就是断言所需类的存在。例如,假设您有一个带有id的div:

<div id="mydiv">blah</div>

你有一些Javascript可以添加类&#34; someclass&#34;单击按钮时从div中显示:

$this->click("id=mybutton"); // this click should add the class

// now test to see if the class has been added
$this->assertElementPresent("css=div#mydiv.someclass");

div#mydiv会以这种或那种方式存在。只有在添加了课程div#mydiv.someclass后才会存在someclass

请注意,我的断言语法与您的语法略有不同 - 我使用的是一步assertElementPresent方法。 PHPUnit_Extensions_SeleniumTestCase类公开了一大堆与Selenium文档中的断言相匹配的有用断言。

答案 1 :(得分:0)

在具有PHPUnit_Extensions_Selenium2TestCase语法的Selenium 2中,我们鼓励您使用PHPUnit标准断言,并且仅使用selenium来访问页面元素(而不是v1中两者的混合)。

你可以这样做:

$element = $this->byId('some_div');
$this->assertContains('active', $element->attribute('class'));

或类似于Kryten的回答你可以尝试“获取”元素并让它失败或处理异常转换为失败甚至继续:

try{
    $element = $this->byByCSSSelector('div#some_div.active');
} 
catch(PHPUnit_Extensions_Selenium2TestCase_WebDriverException $e) {        
    $this->fail('Class "active" not found. '.$e->getMessage());
}

我个人更喜欢第一种方法。