PHPUnit扩展Selenium 2(webdriver)和多个浏览器

时间:2012-10-02 13:47:13

标签: phpunit selenium-rc selenium-webdriver

我用PHPUnit扩展名Selenium2TestCase编写了一个测试用例。它确实很好用,但我无法弄清楚make如何在各种浏览器上自动运行此测试。

方法setBrowser()仅适用于setUp()方法。我想到了这样的事情:

/**
 * @dataProvider browsers
 */
public function loginTest($browser) {
    $this->setBrowser($browser);
    // tests...
}

但我不行。尝试运行默认浏览器(可能我的Safari有点乱,上次使用firefox)

RuntimeException: Safari could not be found in the path!
Please add the directory containing ''Safari'' to your PATH environment
variable, or explicitly specify a path to Safari like this:
*safari /blah/blah/Safari

PS。 SeleniumTestCase(不基于webdriver)提供了一个xml配置,我们可以在其中指定浏览器。 Selenium2TestCase不支持。

欢迎任何建议。谢谢。 马尔钦

4 个答案:

答案 0 :(得分:4)

类似这样的事情

    class WebTestCase extends \application\components\test\ExWebTestCase
    {
      // default params
      public $parameters = array(
          'host'                          => 'localhost',
          'port'                          => 4444,
          'seleniumServerRequestsTimeout' => 30000,
          'timeout'                       => 30000,
      );

      // list of browsers with per-browserconfig
      public static $browsers = array(
          array(
              'browserName' => 'firefox',
          ),
          array(
              'browserName' => 'chrome',
          ),
          array(
              'browserName' => 'safari',
          ),
          array(
              'browserName' => 'internet explorer',
              'host' => 'some IP of VirtualBox with IE'
          )
      );
  }

答案 1 :(得分:2)

对此的修复实际上取决于您的数据文件的外观。如果你能发帖我们可以帮助你更多。

暂时我假设因为phpunit本质上是一次一个单元测试框架,你不是试图同时运行多个浏览器,而只是想保留更改浏览器的选项你认为合适。

你应该在setUp中使用setBrowser。执行时,PHPUnit将始终首先运行setUp,而tearDown()最后运行。这里的一个好习惯是创建自己的自定义单元测试用例类,您可以在其中自定义这些方法。

class customUnitTest extends PHPUnit_Extensions_Selenium2TestCase {
   public $browser = "firefox";
   public function setUp() {
      $this->setBrowser("*".$browser);
   }
}

现在,当您编写测试时,请扩展您的个人测试类并相应地设置浏览器

class newTest extends customUnitTest {
   $this->browser = "safari";
   public function testBlah {
      blah blah...
   }
}

setUp将在执行时运行,它将引入浏览器变量。默认情况下,您将获得Firefox,但如果某些测试在其他浏览器上进行了更适当的测试,则可以使用该选项。

如果您希望能够同时更改所有测试中的所有浏览器,则应考虑根据环境变量分配浏览器值。

class customUnitTest extends PHPUnit_Extensions_Selenium2TestCase {
   try {
      public $browser = getenv("SELENIUM_BROWSER");
   } catch (Exception $e) {
      public $browser = "firefox";
   }
   public function setUp() {
      $this->setBrowser("*".$browser);
   }
}

通过此设置,我们可以通过更改环境变量SELENIUM_BROWSER来更改浏览器中没有对浏览器进行硬编码的每个测试。这样我们可以在不同的服务器上使用不同的默认浏览器运行相同的代码,而无需重新编写任何内容。

请注意,多重继承并不是一种好习惯。如果您没有正确地调整方法/变量的范围,它可能会导致代码脆弱甚至安全威胁。但是在这种情况下它很有用,因为我们可以根据需要定义PHPUnit框架方法,并且我们在测试中获得所有基本selenium方法。因此,要运行默认的selenium方法,我们只需编写

$this->open("www.google.com");

这是一种与将selenium分配给对象的一般方法完全不同的方法,因为你编写的测试是selenium对象,但它似乎更适合php,特别是对于这个用例。

答案 2 :(得分:2)

要在多个浏览器中运行,请检查以下链接:

http://phpunit.de/manual/current/en/selenium.html 例17.4(phpunit 3.7)   如果您在localhost中运行测试用例,请使用'host'=>'localhost'。 setBrowser()函数不需要..

答案 3 :(得分:1)

使用者应该使用$ browsers属性来定义多个浏览器,如上所述。