3

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

class BlaBlaTest extends PHPUnit_Extensions_SeleniumTestCase
{... }  

或者

class BlaBlaTest extends PHPUnit_Extensions_Selenium2TestCase  
{...}  

第一个 ( PHPUnit_Extensions_SeleniumTestCase) 使用起来不太方便(例如,没有$this->elements('xpath'))。
Second( PHPUnit_Extensions_Selenium2TestCase) 的功能也有限(例如,没有waitForPageToLoad() or之类的功能clickAndWait(),并且使用类似的东西$this->timeouts()->implicitWait(10000)在我看来完全是胡说八道)。

是否可以使用函数式

PHPUnit_Extensions_SeleniumTestCase + PHPUnit_Extensions_Selenium2TestCase

在一个测试班?也许 smb 知道 phpunit+selenium 的好替代品?

4

4 回答 4

4

受 Dan 的启发,我写了这个供使用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; 
} 
于 2013-06-18T13:36:34.203 回答
1

很抱歉让这个问题复活,但我希望能为任何偶然发现这个问题的人消除一些困惑。

你是说你想要从有变通方法的地方获得功能RC结合WebDriver起来,但我不推荐它。首先,您需要了解这两个框架之间的区别

我的简要定义...

  • Selenium RC ( PHPUnit_Extensions_SeleniumTestCase) 是面向脚本的。我的意思是它会以你期望页面响应的方式运行你的测试。这通常需要更明确的命令,例如waitForPageToLoad()您在等待元素出现和/或页面加载时提到的命令。
  • Selenium WebDriver ( PHPUnit_Extensions_Selenium2TestCase) 使用更原生的方法。它切断了“中间人”并通过您选择的浏览器驱动程序运行您的测试。使用该waitForPageToLoad()示例,您无需在代码中打开页面的任何位置显式放置它,因为 WebDriver 已经知道页面何时加载,并且将在页面加载请求完成时恢复测试。

如果您需要在 WebDriver 中定义一个隐式超时,您只需将其放在setUp()将在您的测试类中扩展的基本 Selenium 类中的方法中;

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

这将愉快地跨越您的所有测试,并且每当页面加载时间超过加载时间时都会超时。

虽然我个人更喜欢WebDriverRC主要是因为它快得多!)但可用的方法之间存在很大差异。每当我最近将很多RC测试转换为时遇到困难,WebDriver 我总是首先转向这个。它对几乎所有情况都有很好的参考。

我希望这有帮助吗?

于 2015-02-18T11:56:38.720 回答
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
于 2013-04-01T20:17:29.327 回答
0

您可以尝试使用特征来扩展两个不同的类http://php.net/manual/en/language.oop5.traits.php

    class PHPUnit_Extensions_SeleniumTestCase{
       ...
    }

将 PHPUnit_Extensions_Selenium2TestCase 类更改为特征:

 trait PHPUnit_Extensions_Selenium2TestCase {
       ...
    }

    class blabla extends PHPUnit_Extensions_SeleniumTestCase {
        use PHPUnit_Extensions_Selenium2TestCase;

        your tests here..
    }
于 2014-12-21T14:45:27.593 回答