Selenium 硒的使用

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)的功能也有限

我的问题是关于phpunit+硒的使用。
这个联合体的标准用法是

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
    )使用了一种更原生的方法。它切断了“中间人”并通过您选择的浏览器驱动程序运行您的测试。使用
    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
     }
}

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
     }
}