Selenium 2(WebDriver)和Phpunit?

39

有人知道如何在Phpunit中使用Selenium 2吗? 是否有用PHP编写的Selenium 2示例?


11
这是一个非常好的问题。我一段时间之前也想问它,因为很抱歉,Selenium页面对于PHP用户来说并不是很友好。最近有很多关于WebDriver的热议,但我还没有见过这两个工具的实际应用。 - takeshin
3
PHPUnit 从版本 3.6 开始支持 Selenium2。 有关详细信息,请参见 http://www.phpunit.de/manual/3.6/en/selenium.html#selenium.selenium2testcase。 - Potherca
11个回答

19

快速更新:phpunit现在支持Selenium 2


目前为止,PHPUnit不支持Selenium 2。

facebookphp-webdriver以优雅的方式允许从PHP调用完整的WebDriver API。引用如下:

大多数客户端要求您首先阅读协议以了解可能性,然后再研究客户端本身以了解如何调用它。这希望消除后者一步。

它通过启动Selenium 2服务器来使用,该服务器在localhost:4444/wd/hub提供接口。

/usr/bin/java -jar /path/to/selenium-server-standalone-2.7.0.jar

然后运行PHP测试代码,调用该接口。例如:

<?php

require '/path/to/php-webdriver/__init__.php';

$webdriver = new WebDriver();

$session = $webdriver->session('opera', array());
$session->open("http://example.com");
$button = $session->element('id', 'my_button_id');
$button->click();
$session->close();

WebDriver API被映射到PHP方法,可以将示例中在element上调用click与文档中的元素/点击API调用进行比较。

然后,测试代码可以包装在常规的phpUnit测试中。

这不是本地phpUnit支持,但它是一种相当稳健的方法。


感谢您指出这个 Facebook 包装器。看起来有很多命令无法正常工作,比如 sendKeys。 - Adil
嗨,阿迪尔!你是指“其他PHP Selenium实现”中有很多命令无法正常工作,对吧?这只是使用此实现的另一个原因,其架构本质上使其完整。 - cmc
1
@cmc:@php-webdriver@中没有任何东西使其“固有完整”(尽管添加新命令似乎相当容易)。有一个静态的接受命令列表(请参见各个类中的@getMethod()@函数)。 - Tgr
@Tgr:请参考自述文件中的“一些无法避免的直接协议转换异常”部分。 - cmc
1
快速更新 - phpunit 现在支持 Selenium 2 http://www.phpunit.de/manual/3.6/en/selenium.html - Polsonby
显示剩余3条评论

8

2
还有另外一个Php绑定库。这两个库目前似乎都非常活跃。 - Stéphane
PHPUnit有自己的Selenium库,它更好地模拟了JsonWireProtocol webdriver绑定(http://www.phpunit.de/manual/3.6/en/selenium.html)。如果您想使用WebDriver,Facebook的WebDriver库得到了更积极的支持。 - bcoughlan
最后更新已有两年。请使用instaclick/webdriver包代替! - falsch

5

目前(2017年),我建议使用php-webdriver,这是我所知道的与Selenium WebDriver交互最完整的PHP语言绑定。

这个库在2014年被重写以支持Selenium 2,并且其API大部分基于官方的Java WebDriver绑定。这意味着您也可以利用用Java编写的代码示例,在PHP中通常可以简单地跟随。它还以现代OOP方式编写,并遵循标准PSR-4命名空间和PSR-2编码标准。

相比之下,我会推荐这个库而不是phpunit-selenium - 因为它最初是为Selenium 1设计的(尽管现在支持Selenium 2),而且其API与PHPUnit紧密绑定。它也不支持某些WebDriver功能,并且没有更新到即将发布的W3C WebDriver规范

另一方面,Php-webdriver是一个独立的库,但它与PHPUnit的集成非常简单 - 或者您可以使用现有的工具,如Steward,它包括所有PHPUnit集成,并提供方便的层,例如允许简单地并行运行多个测试(无需另一个工具,如paratest)。

项目主页上还提到了其他测试框架集成选项。


正好最近我重新尝试了半官方的phpunit-selenium,发现文档仍然不足。不过,让这个工具可靠地运行也是一个挑战。 - Paul R Rogers

3
PHPUnit Selenium集成代码作为一个独立的项目存在于github中,据我所知它不支持Selenium 2,因此对于你的问题答案是 - 不可以使用Selenium 2与PHPUnit。但你可以克隆源代码并使其与Selenium 2一起工作。

目前我已经决定使用Java进行测试。无论如何,Java的Dbunit比PHP端口快得多。 - Paul R Rogers
1
Selenium支持PHPUnit:http://www.phpunit.de/manual/3.6/en/selenium.html - bcoughlan

2
我们创建了一个相关的库,希望它能够对你有所帮助。该库同样使用JSON Wire协议,但我们旨在使其与其他语言的示例兼容,因此语法非常相似。这是链接:https://github.com/Nearsoft/PHP-SeleniumClient 如果你喜欢它,请分享、改进或分支 :)
祝好,马克。

1
我推荐使用 Menta,这是一个需要 WebDriver 的 Selenium 2 框架。这两个软件包都兼容 PSR-0,因此您可以使用 Composer 进行安装。您可以通过 phpunit.xml 配置 selenium。以下是一个示例。
<phpunit bootstrap="tests/bootstrap.php"
         backupGlobals="false" backupStaticAttributes="false"
         strict="true" verbose="true">
    <php>
        <var name="testing.selenium.seleniumServerUrl" value="http://localhost:4444/wd/hub" />
        <var name="testing.selenium.browser" value="firefox" />
        <var name="testing.selenium.windowPosition" value="0,0" />
        <var name="testing.selenium.windowSize" value="1280x1024" />
        <var name="testing.selenium.windowFocus" value="1" />
        <var name="testing.selenium.timeoutImplicitWait" value="10000" />
    </php>
    <testsuites>
        <testsuite name="Integrationstests">
            <directory suffix="Test.php" phpVersion="5.3.0" phpVersionOperator=">=">tests/integration</directory>
        </testsuite>
    </testsuites>
    <logging>
        <log type="junit" target="build/logs/junit.xml"/>
    </logging>
</phpunit>

引导文件会从testing.selenium.*读取配置变量,因此您可以轻松设置新变量。
<?php

\Menta_ConfigurationPhpUnitVars::addConfigurationFile(__DIR__ . '/../phpunit.xml');

$configuration = \Menta_ConfigurationPhpUnitVars::getInstance();
\Menta_SessionManager::init(
    $configuration->getValue('testing.selenium.seleniumServerUrl'),
    $configuration->getValue('testing.selenium.browser')
);

现在您可以轻松地实现测试用例。这里是一个例子。
<?php

namespace tests\integration;

use WebDriver\LocatorStrategy;

class TestSearch extends \PHPUnit_Framework_TestCase
{
    public function testGoogle()
    {
        $session = \Menta_SessionManager::getSession();
        $session->open('http://www.google.de');
        $element = $session->element(LocatorStrategy::NAME, 'q');
        $this->assertTrue($element->displayed());
    }
}

Menta软件包还有两个演示文件,位于这里


1

1
今天我深入学习了Selenium和phpunit。你可以在这里找到一些示例和说明:http://phpunit.de/manual/current/en/selenium.html phpunit的创建者提供了一些不错的api示例。通过一些实验和阅读错误信息,你会慢慢掌握。我自己也没有找到一个很好的库。

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

作为最后一个由Nettuts提供的教程,它将帮助您掌握基础知识:http://net.tutsplus.com/tutorials/php/how-to-use-selenium-2-with-phpunit/

1

PHPUnit WebDriver绑定托管在Google Code上。除此之外,还有一些需要我们了解的内容。

  1. 必须安装PHPUnit(可以通过PEAR包或手动下载和安装)
  2. 必须下载并安装PHP IDE,如Eclipse PDT。
  3. 在执行WebDriver Selenium测试时,必须运行Selenium-Stand-Alone服务器。

6
为什么需要安装IDE呢? - Eric Cope

0

我在selenium2php上工作。我有太多的Selenium1测试记录在Selenium IDE中。现在,它将html测试转换为Selenium2。实际上,是为了PHPUnit_Extensions_Selenium2TestCase。我将要实现更多的命令。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接