Selenium 硒的使用
我的问题是关于phpunit+硒的使用。Selenium 硒的使用,selenium,phpunit,selenium-webdriver,selenium-rc,Selenium,Phpunit,Selenium Webdriver,Selenium Rc,我的问题是关于phpunit+硒的使用。 这个联合体的标准用法是 class BlaBlaTest extends PHPUnit_Extensions_SeleniumTestCase {... } 或 第一个(PHPUnit\u Extensions\u SeleniumTestCase)使用起来不是很方便 (例如,没有$this->elements('xpath'))之类的东西。 第二个(PHPUnit\u Extensions\u Selenium2TestCase)的功能也有限
这个联合体的标准用法是
class BlaBlaTest extends PHPUnit_Extensions_SeleniumTestCase
{... }
或
第一个(PHPUnit\u Extensions\u SeleniumTestCase
)使用起来不是很方便
(例如,没有$this->elements('xpath')
)之类的东西。第二个(
PHPUnit\u Extensions\u Selenium2TestCase
)的功能也有限
(例如,没有诸如等待页面加载()
或单击并等待()
之类的函数,
使用类似于$this->timeouts()->implicitWait(10000)
的东西对我来说就像
完全胡说八道)
是否可以使用功能性测试
PHPUnit_Extensions_SeleniumTestCase + PHPUnit_Extensions_Selenium2TestCase
在一个测试班?
也许smb知道phpunit+selenium的好替代方案?对于在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
受Dan的启发,我写这篇文章是为了在
PHPUnit\u Extensions\u 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;
}
/**
*@param string$id-DOM id
*@param int$wait-最大值(秒)
*@retrn元素| false-超时时为false
*/
受保护的函数waitForId($id,$wait=30){
对于($i=0;$i byId($id);
返回$x;
}
捕获(例外$e){
睡眠(1);
}
}
返回false;
}
您可以尝试使用traits扩展两个不同的类
将PHPUnit_Extensions_Selenium2TestCase类更改为trait:
trait PHPUnit_Extensions_Selenium2TestCase {
...
}
class blabla extends PHPUnit_Extensions_SeleniumTestCase {
use PHPUnit_Extensions_Selenium2TestCase;
your tests here..
}
很抱歉,我想再次提起这件事,但我希望能为任何遇到这件事的人澄清一些困惑 你是说你想让
RC
和WebDriver
的功能在有解决办法的地方结合起来,但我不推荐。首先你需要理解
我的简短定义
- Selenium RC(
)是面向脚本的。我的意思是,它将以您期望的页面响应方式运行您的测试。这通常需要更明确的命令,如PHPUnit\u Extensions\u SeleniumTestCase
您在等待元素出现和/或页面加载时提到的waitForPageToLoad()
- SeleniumWebDriver(
)使用了一种更原生的方法。它切断了“中间人”并通过您选择的浏览器驱动程序运行您的测试。使用PHPUnit\u Extensions\u Selenium2TestCase
例如,您不需要在代码中明确地将其放在打开页面的任何位置,因为WebDriver已经知道页面何时加载,并将在页面加载请求完成后恢复测试waitForPageToLoad()
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
}
}
class BaseSelenium扩展了PHPUnit\u扩展\u Selenium2TestCase{
受保护的函数设置(){
//这里还有什么其他需要的东西,比如布景
//主机url和端口等。
$this->setSeleniumServerRequestsTimeout(100);//谢谢您的回答!您能给我一个代码示例吗?我更喜欢使用smth wich,当页面完全加载后,只有下一段代码才会执行,而不是使用smth like sleep()。我现在有一个想法,就是使用循环,它以try-catch的形式每秒检查元素的存在,但这种方法对我来说就像是一个黑客。我用一些示例Ruby代码更新了我的答案,以帮助解释我的答案。这个想法是将隐式等待(如element.present)合并到显式循环中,如带有sleep-stateme的for循环nt包括在内。如果隐式等待发生错误,您可以通过使用try-catch块来实现类似的技术。PHPUnit\u Extensions\u Selenium2TestCase使用webdriver,正如您的示例所知,$this->timeouts()->implicitWait(10000)
,它有一个隐式超时。这是Selenium将尝试查找元素的超时。因此,当执行ajax调用时,只选择结果应该在大部分时间都有效。我肯定会选择Webdriver路线,它总体上比旧的RC更稳定-way@qrazi我会把它作为回答,你说得对it@qrazi我喜欢这是一个简单明了的解决方案。当您收到诸如“元素当前不可见,因此可能无法与之交互”之类的错误时,问题就会出现在一个站点上,元素可能已加载并可查找,但尚未准备好与之交互。在上述解决方案中,您仍然可以捕获这些异常并继续等待。对我来说也很好!使用类型变量上的switch语句扩展代码,以接受多个查找方法,而不仅仅是ID。此方法是扩展的良好基础d以满足您的个人需求。:)也可以使用waitClick之类的方法,或者不返回false,您可以强制执行失败的断言,以便在该方法无法返回元素时测试失败。很好,这是一个简单、清晰且非常有效的解决方案。我在不同的上下文中使用这个try cache循环,例如等待元素可单击。Thxlook@Paradiddley's回答谢谢!这是阅读时最好的答案。
trait PHPUnit_Extensions_Selenium2TestCase {
...
}
class blabla extends PHPUnit_Extensions_SeleniumTestCase {
use PHPUnit_Extensions_Selenium2TestCase;
your tests here..
}
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
}
}