【问题标题】:PHPUnit extension Selenium 2 (webdriver) and multiple browsersPHPUnit 扩展 Selenium 2 (webdriver) 和多个浏览器
【发布时间】:2012-09-23 09:06:20
【问题描述】:

我写了一个带有 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 不支持。

欢迎提出任何建议。谢谢。 马辛

【问题讨论】:

    标签: phpunit selenium-rc selenium-webdriver


    【解决方案1】:

    类似的东西

        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'
              )
          );
      }
    

    【讨论】:

      【解决方案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,尤其是对于这个用例。

      【讨论】:

      • 很好,即使 getenv 和继承不是一个顺利的解决方案。无论如何,它显示了我能做什么。谢谢。 PS。我希望 Selenium2TestCase 的实现在我写问题后发生了变化……或者将会发生。
      【解决方案3】:

      要在多个浏览器中运行,请查看此链接:

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

      【讨论】:

      • 我记得它适用于 SeleniumTestCase 而不是 Selenium2TestCase。
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2011-05-11
        • 1970-01-01
        • 2018-08-08
        • 2023-03-31
        • 2016-08-16
        • 1970-01-01
        • 1970-01-01
        • 2011-11-23
        • 1970-01-01
        相关资源
        最近更新 更多