selenium - 在 Sauce.io phpunit selenium 测试中动态设置 $browsers 静态属性

标签 selenium phpunit saucelabs

我正在使用 SauceLabs 设置一些浏览器测试。我已经能够在本地和通过 Sauce 运行测试,所以我现在尝试将它与我的 Jenkins 安装集成以自动触发构建和浏览器测试。

其中大部分都有效,但我有一个小问题。为了可以在本地和通过 Sauce 运行测试,我想在 phpUnit setup() 函数期间设置 $browsers 静态属性,而不是对其进行硬编码。这似乎不可能。

我正在使用 Sausage 绑定(bind),我的 TestCase 看起来与此演示非常相似:https://github.com/jlipps/sausage/blob/master/WebDriverDemo.php

我曾尝试在 setUp() 中更新 $browsers 数组,但它似乎从未生效。例如。

public function setUp()
{   
    self::$browsers = array(
        'browserName' => getenv('SELENIUM_BROWSER'),
        'desiredCapabilities' => array(
            'version' => getenv('SELENIUM_VERSION'),
            'platform' => getenv('SELENIUM_PLATFORM'),
         )
     );
}

有没有办法从 Jenkins 传递浏览器详细信息,以便测试用例更加灵活?我觉得我在这里遗漏了一些简单的东西?

最佳答案

在花了相当多的时间挖掘源代码之后,我找到了“多浏览器”场景的解决方案。 chapmatic 关于多个浏览器的断言和给定的答案确实是正确的:如果您在 $browsers 数组中定义了多个浏览器,它不适用于并行测试并多次运行同一个浏览器。该解决方案仍使用环境变量,但您仍必须使用 $browsers 数组。

因此,首先确保在抽象测试类中定义了 $browsers 数组。然后,假设您定义了 env var BROWSER 并为其分配要测试的浏览器。您可以在扩展 Sauce\Sausage\WebDriverTestCase 的抽象测试类中设置以下静态函数:

    public static function browserSetup()
    {   
        switch (getenv('BROWSER')) {
            case 'firefox':
                self::$browsers = array(
                    array(
                        'browserName' => 'firefox',
                        'desiredCapabilities' => array(
                            'platform' => 'self::WIN_VERSION',
                            'version' => self::FIREFOX_VERSION,
                        )   
                    )   
                );  
                break;

            case 'safari':
                //safari desiredCapabilities
               break;

            case 'explorer':
                //ie desiredCapabilities
               break;

           case 'chrome':
             //chrome desiredCapabilities

           default: //This will just use the default $browsers array you defined
         return;
    }

现在 browserSetup() 已定义,您必须确保在设置测试套件之前调用它,以便将测试设置为仅在您在 BROWSER 环境变量中指定的浏览器上运行。再来看看PHPUnit_Extensions_Selenium2TestCase,它是Sauce\Sausage\WebDriverTestCase所消耗的; PHPUnit_Extensions_Selenium2TestCase 定义了以下方法:
public static function suite($className)
{   
    return PHPUnit_Extensions_SeleniumTestSuite::fromTestCaseClass($className);
} 

调用此方法以使用您在 $browsers 数组中指定的所有浏览器设置测试套件,因此您需要在抽象测试类中覆盖此方法,确保在调用 fromTestCaseClass() 之前调用 browserSetup():
public static function suite($className)
{   
    self::browserSetup();
    return PHPUnit_Extensions_SeleniumTestSuite::fromTestCaseClass($className);
} 

现在,如果您使用要测试的浏览器定义环境变量 BROWSER,您可以启动您的测试套件,并且您的 $browsers 数组将被您为 BROWSER 环境变量中定义的单个浏览器指定的设置正确覆盖。确保 jenkins 在 Build->Execute shell 部分中正确设置了这个环境变量,一切顺利。

关于selenium - 在 Sauce.io phpunit selenium 测试中动态设置 $browsers 静态属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13972304/

相关文章:

点击元素时出现 Python Selenium 问题

php - 如何使用 PHPUnit 测试 Symfony2 模型

file-upload - Selenium、PHPUnit 和 AttachFile()

selenium-webdriver - 在 Saucelabs Windows7 中运行 Selenium 测试

密码为 "@"的 HTTP 基本认证 URL

java - 使用用 Java 编写的现有 Selenium 测试的 AngularJs 端到端测试

java - 即使启用了 javascript,HtmlUnitDrivers 向下滚动页面也无法在 java 中工作

groovy - 如何运行具有依赖项的Java groovy混合项目

selenium - 你如何专注于 selenium ide 的新窗口?

php - Symfony2 中的 PHPUnit 错误