我的问题是关于phpunit + selenium的用法 此联合的标准用法是
class BlaBlaTest extends PHPUnit_Extensions_SeleniumTestCase
{... }
OR
class BlaBlaTest extends PHPUnit_Extensions_Selenium2TestCase
{...}
第一个(PHPUnit_Extensions_SeleniumTestCase
)使用起来不太方便
(例如,没有$this->elements('xpath')
)这样的东西
第二个(PHPUnit_Extensions_Selenium2TestCase
)也具有有限的功能
(例如,没有waitForPageToLoad()
或clickAndWait()
等功能,
并使用类似$this->timeouts()->implicitWait(10000)
之类的东西来寻找我
完全废话)。
是否可以使用功能
PHPUnit_Extensions_SeleniumTestCase + PHPUnit_Extensions_Selenium2TestCase
在一个测试类中? 也许smb知道phpunit + selenium的好方法吗?
答案 0 :(得分:3)
受丹的启发我写了这篇文章用于PHPUnit_Extensions_Selenium2TestCase
,似乎工作正常:
/**
* @param string $id - DOM id
* @param int $wait - maximum (in seconds)
* @retrn element|false - false on time-out
*/
protected function waitForId($id, $wait=30) {
for ($i=0; $i <= $wait; $i++) {
try{
$x = $this->byId($id);
return $x;
}
catch (Exception $e) {
sleep(1);
}
}
return false;
}
答案 1 :(得分:0)
对于在Selenium2中不可用的waitForPageToLoad()和clickAndWait()等函数,可以使用try catch块以及隐式等待和显式休眠来重现这些函数。
因此,对于像clickAndWait()这样的函数,您可以定义要等待的元素,然后检查该元素是否存在一定的秒数。如果该元素不存在,则try catch块将阻止错误传播。如果元素确实存在,则可以继续。如果在设定的时间后元素不存在,则冒泡错误。
我建议使用Selenium2,然后在框架内重现您认为缺少的任何功能。
实施例
def wait_for_present(element, retry = 10, seconds = 2)
for i in 0...retry
return true if element.present?
sleep(seconds)
end
return false
end
答案 2 :(得分:0)
您可以尝试使用特征来扩展两个不同的类http://php.net/manual/en/language.oop5.traits.php
class PHPUnit_Extensions_SeleniumTestCase{
...
}
将PHPUnit_Extensions_Selenium2TestCase类更改为trait:
trait PHPUnit_Extensions_Selenium2TestCase {
...
}
class blabla extends PHPUnit_Extensions_SeleniumTestCase {
use PHPUnit_Extensions_Selenium2TestCase;
your tests here..
}
答案 3 :(得分:0)
对于复活这件事感到抱歉,但我希望能为那些在这个问题上绊脚石的人解决一些困惑。
你说你希望RC
和WebDriver
的功能合并在哪里是的解决方法,但我不推荐它。首先,您需要了解the difference between both frameworks。
我的简短定义......
PHPUnit_Extensions_SeleniumTestCase
)是面向脚本的。我的意思是它将完全按照您期望页面响应的方式运行测试。这通常需要更明确的命令,例如您在等待元素出现时提到的waitForPageToLoad()
和/或要加载的页面。PHPUnit_Extensions_Selenium2TestCase
)使用更原生的方法。它切断了中间人的关注。并通过您选择的浏览器驱动程序运行测试。使用waitForPageToLoad()
示例,您无需在代码中打开页面的任何位置明确地放置它,因为WebDriver已经知道页面何时加载并且在页面加载请求完成时将继续测试。如果需要在WebDriver中定义隐式超时,则只需将其放在基础Selenium类中的setUp()
方法中,该类将在测试类中进行扩展;
class BaseSelenium extends PHPUnit_Extensions_Selenium2TestCase {
protected function setUp() {
// Whatever else needs to be in here like setting
// the host url and port etc.
$this->setSeleniumServerRequestsTimeout( 100 ); // <- seconds
}
}
这将很快跨越所有测试,并且只要页面花费的时间超过加载时间,就会超时。
虽然我个人更喜欢WebDriver
而不是RC
(主要是因为它的速度要快得多!),但可用方法之间存在很大差异。每当我最近将RC
次测试转换为WebDriver
I always turned to this first时遇到困难。它几乎适用于所有情况。
我希望有帮助吗?