2017-12-22 22 views
0

nightstatchをbrowserstackと統合しました。 1つのインスタンスを実行しているとき、正常に動作しています。しかし、1番目のインスタンスが動作しているときに誰かが2番目のテストを別のブラウザ(別のブラウザやプロジェクトの別のブランチから)で実行しようとすると、1番目のインスタンスに「ページに接続できません」というエラーが発生したため、 。それを行う方法は何ですか?私はbrowserstackで並列テストのために2つのスペースを利用できます。 Configsに: nightwatch.conf.jsbrowserstackでnightwatchの複数のインスタンスを実行する

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

答えて

0

これはBrowserStackLocalバイナリが切断なっていることを示しますあなたのテストはまだ実行中です。この問題は、同じ修飾語を持つ複数のBrowserStackLocalバイナリが原因であるようです。サンプルシナリオでこれを説明しましょう。これは、テストエンジニア1のマシン上BrowserStackLocal接続を作成し、彼のテストの実行を開始します。

  • テストエンジニア1 10:00 A.Mでのテストは、(このテストは15分間走ると仮定します)を実行します。
  • テストエンジニア2は、10時10分にテストを実行します。このBrowserStackLocal接続で同じキーが使用されている場合、テストエンジニア1のマシンですでに実行されていた以前のセッションが切断され、テストエンジニア2のマシンでローカル接続が開始されます。これにより、実装されたエラー処理ロジックに基づいてテストエンジニア1が実行するテストのタイムアウトまたは終了が発生する可能性があります。

テストを順番に実行する場合、上記のシナリオが発生しないため、いずれのテストにも影響がありません。

これを避けるには、BrowserStackLocalを起動するときにlocalIdentiferパラメータを使用していることを確認してください。

バイナリ開始するには、コマンドラインを使用している場合は、次のコマンドを使用してください:

マック:

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

のWindows:

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

そして、あなたのテストスクリプトでは、追加してください次の機能 'browserstack.localIdentifier': 'RandomString'

これはあなたのdesiredCapabilitiesが、このような外観を阻止すべきである:

彼らのテスト接続が重なったり、他のエンジニアの接続には影響しないことを保証するために、各テストエンジニアに一意である必要がありますをRandomString
desiredCapabilities: { 
    'browserstack.user': "bla", 
    'browserstack.key': "bla", 
    'browserstack.local': true, 
    'browserstack.localIdentifier':'RandomString' 
    } 

この

関連する問題