以编程方式运行PHP Selenium Web驱动程序测试,无需phpunit命令


Running PHP Selenium Webdriver tests programmatically, without phpunit command

我的问题很简单。我来自Python世界,在那里,在程序中执行Selenium测试代码非常简单,只需编写以下内容即可:

from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://www.python.org")
driver.close()

当使用PHP时,事情变得越来越困难:我写了一些类似的东西

require 'vendor/autoload.php';
class MyTest extends PHPUnit_Extensions_Selenium2TestCase {
    public function setUp() {
        $this->setBrowser('Firefox');
        $this->setBrowserUrl('http://www.python.org');
    }
    public function testToto() {
        $this->url('/');
    }
}

这在我执行CCD_ 1时有点起作用。

但我想做的是用PHP代码安装我的测试类,并"以编程方式"执行我的Selenium命令,比如:

$myTest = new MyTest();
$myTest->testToto();

这里很糟糕:(

PHP致命错误:未捕获异常"PHPUnit_Extensions_Selenium2TestCase_exception",消息为"当前没有活动会话可执行"url"命令。"。

那么,有没有一种方法可以直接从PHP脚本执行Selenium代码,而无需使用phpunit执行命令行操作?

编辑:我想要实现什么?我的项目是构建一个测试应用程序,该应用程序必须能够在最终用户构建的UI中启动测试,这要归功于一个用户友好的拖放生成器(用户选择要首先执行哪个测试,然后再执行另一个测试,依此类推)。因此,我想用一个丑陋的PHP执行程序来接收phpunit命令:对我来说,最好的选择是以编程方式启动测试用例方法!

我认为痛苦来自于尝试使用PHPUnit Web驱动程序集成,而没有真正使用PHPUnit。

您可以使用独立的Webdriver实现(不需要PHPUnit)来编写类似Python示例的代码。我推荐Facebook写的:

https://github.com/facebook/php-webdriver

但还有更多:

http://docs.seleniumhq.org/docs/03_webdriver.jsp#php

您也可以在PHPUnit测试中使用这些实现。我这样做是因为我不喜欢PHPUnit Web驱动程序的实现。

有了这些,用PHP编写示例就变得微不足道了。

首先,这是一个非常好的问题。简短的回答是可以的,但这太痛苦了。PHPUnit只是一个适度复杂、巨大、可怕和令人惊叹的库,有无数的扩展。简而言之,它读取配置,找到测试并运行它们。

你可以在测试中设置一个断点,并追踪到它的作用、接受的参数,并模拟整个过程。这将是一种"恰当"和疯狂的方式,也是最复杂的方式。

更简单的方法是找出测试用例类运行所需的内容(断点和跟踪始终是您最好的朋友),在这种特殊情况下,结果是:

$myTest = new MyTest();
$myTest->setUp();           // Your setup will always be called prior the test.
$myTest->prepareSession();  // Specific to Selenium test case, called from `runTest` method.
$myTest->testToto();

但是,即使在PHPUnit_Extensions_Selenium2TestCase中,也有很多东西是不可公开的,这感觉只是运气好。但你明白了。此外,简单地调用测试用例类的方法会导致两件事:什么都不发生,或者您得到一个异常。所有花哨的结果跟踪都发生在层次结构的更高层。

我只能猜测你试图实现什么,但如果你问一个关于实际问题的问题,我们可能会提供更多帮助。

编辑

exec可能看起来确实很丑陋,但它存在的原因很充分:过程隔离。在某些情况下,正在测试的一段代码会更改环境,并与另一段代码发生冲突,例如与会话相关的、已发送的标头等。当您遇到其中一段代码时,您将在exec上祈祷。

在您的情况下,最简单的方法是从命令行启动PHPUnit,但您可能需要编写一个自定义格式化程序来从中获得必要格式的数据,除非您对现有的格式感到满意。

另一种选择是使用WebDriver/SeSelenium的现有客户端,并简单地将命令直接发送到Selenium服务器,我想这就是您真正需要的?你可以在PHPUnit扩展中找到负责这一点的代码,或者还有另一个很酷的项目叫Behat(和Mink)。我相信他们的客户在Behat/MinkSelenium2驱动程序存储库中。如果你不喜欢这些,我相信你可以在github上找到其他php包装器,或者可以使用现有的包装器作为例子创建自己的包装器。

附言:当项目启动并运行时,如果是公共项目,请共享项目链接。