我的问题很简单。我来自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命令:对我来说,最好的选择是以编程方式启动测试用例方法!
答案 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:在项目启动并运行时,共享指向该项目的链接。