我的问题很简单。我来自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 exec执行phpunit命令:对我来说,最好的选择是以编程方式启动测试用例方法!
嗯,首先是一个非常好的问题。简而言之,你可以,但这太痛苦了。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包装,或者以现有的为例创建自己的包装。
附言:当项目启动并运行时,如果项目是公开的,则共享该项目的链接。
我认为痛苦来自尝试使用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编写示例就变得很简单了。
问题内容: 如何在“ PHP内”运行测试,而不是使用“ phpunit”命令?例: 还是我必须将测试写入文件,通过system()/ exec()调用phpunit并解析输出?:( 问题答案: 只需使用随附的驱动程序即可。 然后,您需要像SeleniumTestCase一样进行设置: 然后:
问题内容: 我正在尝试通过Java类运行JUnit测试: 问题是我的JUnit测试需要当前在JUnit测试本身中进行硬编码的数据库连接。 我正在寻找一种以编程方式(上面)运行JUnit测试的方法,但是将数据库连接传递给我在运行测试的Java类中创建的数据库连接,而不是在JUnit类内进行硬编码。 基本上像 然后在classToRun中: 我知道@Parameters,但是它在这里似乎并不适用,因为
我使用java类从excel文件动态生成testNG xml。我使用allure-cli在测试执行结束时生成allure报告。 我正在使用maven-surefire插件进行以下配置。 当测试由maven目标和阶段触发时,我能够生成包含完整日志和屏幕截图的诱惑力报告,这些日志和屏幕截图由诱惑力注释(@step、@attachments、@Story…)附加。 但是,当java类(生成testNG
我有一个运行selenium phpunit测试的ant构建脚本。我可以在命令行上运行构建脚本,然后看到测试正在进行,浏览器窗口打开,并且selenium测试正在执行。命令行上一切正常。 但是,如果我得到创建一个jenkins jobs来运行构建脚本。它在尝试运行phpunit任务时失败。这是控制台输出。 看起来,当jenkins运行构建时,它不能访问Selenium。请参阅“访问被拒绝”和“网页
问题内容: 我有一个Spring Batch应用程序,我从开始。但是现在我必须将此应用程序嵌入到我们的公司环境中。在那里,我们必须使用自己的启动器应用程序。对于此启动器应用程序,我需要一个带有main方法的启动类,该类将在启动时以及必须在其中启动Spring Batch的地方调用。 是使用此启动器手动分配和运行Job 的唯一方法,还是Spring Batch中有一个支持该类的类(或有人知道一个示例
问题内容: 我奋力奔跑名为单个测试方法在文件中使用。我尝试了以下组合: 在每种情况下, 都将执行文件中的 所有 测试方法。如何只选择一种方法呢? 该类的名称为,版本为3.2.8。 问题答案: 以下命令在单个方法上运行测试: 对于新版本的phpunit,它只是: