以编程方式运行PHP Selenium Webdriver,无需phpunit命令

时间:2014-10-16 22:56:51

标签: php selenium phpunit

我的问题很简单。我来自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('/');
    }

}

...当我执行phpunit MyTest.php时,哪种方式有效。

但我想做的是在PHP代码中实现我的测试类,并执行我的Selenium命令"以编程方式" ,如:

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

这里很糟糕:(

  

PHP致命错误:未捕获的异常' PHPUnit_Extensions_Selenium2TestCase_Exception'有消息'目前没有活动会话来执行' url'命令。

所以有没有办法直接从PHP脚本执行Selenium代码而不用phpunit 执行命令行?

修改:我想要实现的目标是什么?我的项目是构建一个测试应用程序,它必须能够在最终用户构建的UI中启动测试,这要归功于用户友好的拖放构建器(用户选择他想先执行哪个测试,然后是另一个,等等) )。所以我想用一个丑陋的PHP执行程序来执行phpunit命令:对我来说,最好的选择是以编程方式启动测试用例方法!

2 个答案:

答案 0 :(得分:2)

我认为痛苦来自于尝试使用PHPUnit Webdriver集成,而没有真正使用PHPUnit。

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

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

但还有更多:

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

您也可以在PHPUnit测试中使用这些实现。我这样做,因为我不喜欢PHPUnit Webdriver实现。

用PHP编写你的例子是非常简单的。

答案 1 :(得分:1)

嗯,首先是一个非常好的问题。简短的回答是肯定的,但是这太痛苦了。 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 / Selenium的现有客户端,只需将命令直接发送到Selenium服务器,我认为这是你真正需要的吗?您可以在PHPUnit扩展中找到负责该代码的代码,或者还有另一个名为Behat(和Mink)的酷项目。我相信他们的客户在Behat/MinkSelenium2Driver存储库中。如果您不喜欢这些,我确定您可以在github上找到其他的php包装器,或者可以使用现有的包装器创建您自己的包装器。

PS:在项目启动并运行时,共享指向该项目的链接。