【问题标题】:Run multiple instances of nightwatch at browserstack在 browserstack 上运行多个 nightwatch 实例
【发布时间】:2017-12-23 02:40:56
【问题描述】:

我将我的守夜人与 browserstack 集成在一起。当我运行一个实例时,它工作正常。但是当第一个实例正在工作并且有人试图同时运行第二个测试(在不同的浏览器上或只是来自项目的另一个分支)时,第一个实例出现错误“无法连接到页面”,所以可能是第一个 selenium 服务器关闭连接.有什么办法吗? Ofc 我有 2 个空间可用于 browserstack 中的并行测试。 配置: nightwatch.conf.js

const chromedriver = require('chromedriver');

require('nightwatch-cucumber')({
    cucumberArgs: [
        '--require', './tests/step_definitions/hooks.js',
        '--require', './tests/step_definitions',
        '--format', 'json:reports/cucumber.json',
        '--format-options', '{"colorsEnabled":true}',
        './tests/features'
    ]
});

module.exports = {
    output_folder: 'reports',
    custom_assertions_path: 'tests/assertions',
    custom_commands_path: "./node_modules/nightwatch-commands/commands",
    live_output: true,
    disable_colors: false,
    test_settings: {
        default: {
            launch_url: 'http://pptm_nightwatch:3000',
            selenium_host: 'pptm_hub',
            desiredCapabilities: {
                browserName: 'chrome',
                javascriptEnabled: true,
                acceptSslCerts: true,
                loggingPrefs: {
                    'browser': 'ALL'
                }
            },
            selenium: {
                cli_args: {
                    'webdriver.chrome.driver': chromedriver.path
                }
            },
        },
        chrome: {
            desiredCapabilities: {
                browserName: 'chrome',
                javascriptEnabled: true,
                acceptSslCerts: true,
                loggingPrefs: {
                    'browser': 'ALL'
                }
            },
            selenium: {
                cli_args: {
                    'webdriver.chrome.driver': chromedriver.path
                }
            }
        },
    }
};

nightwatch.browserstack.conf.js

const defaultConfig = require('./nightwatch.conf');

const browserstackConfig = {
  selenium: {
    start_process: false,
    host: 'hub-cloud.browserstack.com',
    port: 80,
  },

  test_settings: {
    default: {
      desiredCapabilities: {
        'browserstack.user': "bla",
        'browserstack.key': "bla",
        'browserstack.local': true,
      },
      globals: defaultConfig.test_settings.default.globals,
    },
    edge: {
      desiredCapabilities: {
        browser: 'edge',
      },
    },
    chrome: {
        desiredCapabilities: {
            browserName: 'chrome',
            javascriptEnabled: true,
            acceptSslCerts: true,
            loggingPrefs: {
                'browser': 'ALL'
            }
        },

    },
  },
};

const nightwatchConfig = Object.assign({}, defaultConfig, browserstackConfig);

Object.keys(nightwatchConfig.test_settings).forEach((key) => {
  const config = nightwatchConfig.test_settings[key];

  config.selenium_host = nightwatchConfig.selenium.host;
  config.selenium_port = nightwatchConfig.selenium.port;
  config.desiredCapabilities = Object.assign(
    {},
    nightwatchConfig.test_settings.default.desiredCapabilities,
    config.desiredCapabilities,
  );
});

module.exports = nightwatchConfig;

server.js:

var _ = require('lodash'),
    fs = require('fs'),
    path = require('path'),
    express = require('express'),
    cons = require('consolidate'),
    bodyParser = require('body-parser');

var PORT = 3000;

function runServer(done) {
    var app = express();

    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({ extended: true }));

    app.engine('html', cons.lodash);
    app.set('views', path.join(__dirname, './templates'));
    app.set('view engine', 'html');
    app.get('/page/:pageId', function(req, res){
      res.status(200).render(req.params.pageId, TEMPLATE_OPTIONS);
    });
    app.post('/form-endpoint', function (req, res) {
        res.status(200).send('<body>POST(' + JSON.stringify(req.body)+')</body>');
    });

    var server = app.listen(PORT, function () {
        done()
    });

    return server;
}
module.exports = runServer;

if (require.main === module) {
    runServer(function () {
        console.log("Starting server on port " + PORT + ". Please visit e.g. http://localhost:" + PORT + "/page/formSimple.html");
    });
}

【问题讨论】:

    标签: node.js selenium nightwatch.js browserstack


    【解决方案1】:

    这表明 BrowserStackLocal 二进制文件在您的测试仍在执行时断开连接。看来这个问题是由于 BrowserStackLocal 二进制文件的多次产生具有相同的修饰符。让我用一个示例场景来解释这一点。

    • 测试工程师 1 在上午 10:00 运行测试(假设此测试运行 15 分钟):这会在测试工程师 1 的计算机上创建 BrowserStackLocal 连接并开始执行测试。
    • 测试工程师 2 在上午 10:10 运行测试:如果此 BrowserStackLocal 连接使用相同的密钥,它将断开已经在测试工程师 1 的机器上运行的前一个会话,并在测试工程师 2 的机器上启动本地连接。这可能会导致测试工程师 1 根据实现的错误处理逻辑运行的测试超时或终止。

    按顺序运行测试时,不会影响任何测试,因为不会出现上述情况。

    为避免这种情况,请确保在启动 BrowserStackLocal 时使用 localIdentifer 参数。

    如果您使用命令行启动二进制,请使用以下命令:

    苹果机:

    ./BrowserStackLocal --key ACCESS_KEY --local-identifier RandomString
    

    窗户:

    BrowserStackLocal.exe --key ACCESS_KEY --local-identifier RandomString
    

    在您的测试脚本中,请添加以下功能 'browserstack.localIdentifier':'RandomString'

    这应该使您的 desiredCapabilities 块看起来像这样:

     desiredCapabilities: {
        'browserstack.user': "bla",
        'browserstack.key': "bla",
        'browserstack.local': true,
        'browserstack.localIdentifier':'RandomString'
      }
    

    ​ 这个 RandomString 对于每个测试工程师应该是唯一的,以确保他们的测试连接不会重叠或影响其他工程师的连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-14
      • 2017-06-08
      • 1970-01-01
      • 1970-01-01
      • 2021-05-09
      • 2018-03-30
      • 1970-01-01
      相关资源
      最近更新 更多