phpunit selenium用法

时间:2013-04-01 15:24:01

标签: selenium phpunit selenium-webdriver selenium-rc

我的问题是关于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的好方法吗?

4 个答案:

答案 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)

对于复活这件事感到抱歉,但我希望能为那些在这个问题上绊脚石的人解决一些困惑。

你说你希望RCWebDriver的功能合并在哪里的解决方法,但我不推荐它。首先,您需要了解the difference between both frameworks

我的简短定义......

  • Selenium RC PHPUnit_Extensions_SeleniumTestCase)是面向脚本的。我的意思是它将完全按照您期望页面响应的方式运行测试。这通常需要更明确的命令,例如您在等待元素出现时提到的waitForPageToLoad()和/或要加载的页面。
  • Selenium WebDriver 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时遇到困难。它几乎适用于所有情况。

我希望有帮助吗?