2017-12-22 27 views
0

브라우저 스탁에 내 야간 시계를 통합했습니다. 하나의 인스턴스를 실행할 때 제대로 작동합니다. 하지만 첫 번째 인스턴스가 작동하고 누군가 다른 시간대 (다른 브라우저 또는 다른 프로젝트의 다른 지점)에서 두 번째 테스트를 실행하려고하면 첫 번째 인스턴스에 "페이지에 연결할 수 없습니다"라는 오류가 표시되어 1 차 셀렌 서버 연결이 닫힐 수 있습니다. . 그것을하는 어떤 방법이 있겠습니까? Ofc는 browserstack에서 병렬 테스트를 위해 2 개의 공백을 사용할 수 있습니다. CONFIGS : 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"); 
    }); 
} 

답변

0

이것은 BrowserStackLocal 바이너리의 연결이 끊어지고 있음을 나타냅니다 테스트는 아직 실행 중입니다. 이 문제는 동일한 수정자를 가진 BrowserStackLocal 바이너리가 여러 번 생성 된 것으로 보인다. 예제 시나리오로 설명해 드리겠습니다. 이 테스트 엔지니어 1의 컴퓨터에 BrowserStackLocal 연결을 생성하고 자신의 테스트 실행을 시작합니다

  • 테스트 엔지니어 (1)는 오전 10시 테스트 (이 테스트는 15 분 동안 실행 가정 할 수 있습니다)를 실행합니다.
  • 테스트 엔지니어 2가 10:10 a.m에 테스트를 실행합니다.이 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이 같은 모양을 차단해야한다 :

자신의 테스트 연결이 겹치거나 다른 엔지니어의 연결에 영향을주지 않는지 확인하기 위해 각각의 테스트 엔지니어에 고유해야을 RandomString
desiredCapabilities: { 
    'browserstack.user': "bla", 
    'browserstack.key': "bla", 
    'browserstack.local': true, 
    'browserstack.localIdentifier':'RandomString' 
    } 

.