Docker中的量angular器testing – asynchronouscallback没有在由jasmine.DEFAULT_TIMEOUT_INTERVAL指定的超时

我已经写了6个e2etesting,使用量angular器为我的Angular2应用程序。 testing在我的Windows 10系统上运行良好。 testing是一致的,并通过所有的时间。

现在我正尝试在CentOS docker容器中运行相同的testing。 testing不一致。 他们一直在失败。

我得到一个错误说

错误:超时 – asynchronouscallback未在由jasmine.DEFAULT_TIMEOUT_INTERVAL指定的超时内调用。

我增加了时间,我已经给了browser.wait(直到存在)在所需的地方,我已经增加了计算资源分配给docker(CPU-3,内存-3328MB)。 似乎没有任何工作。

// Protractor configuration file, see link for more information const { SpecReporter } = require('jasmine-spec-reporter'); exports.config = { allScriptsTimeout: 11000, specs: [ './e2e/**/*.e2e-spec.ts' ], capabilities: { 'browserName': 'chrome', 'chromeOptions': { 'args': [ '--no-sandbox'] } }, directConnect: false, baseUrl: 'http://localhost:3200/', framework: 'jasmine2', jasmineNodeOpts: { showColors: true, defaultTimeoutInterval: 30000, print: function() { // NOOP } }, beforeLaunch: function() { require('ts-node').register({ project: 'e2e/tsconfig.e2e.json' }); }, onPrepare() { browser.driver.manage().window().maximize(); jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); } }; 

其中一个testing

 // create a user and he should be able to login after creation it('should add a new user and log him in successfully', () => { browser.wait(until.presenceOf(userCreate.forename, 5000, 'Timed out')); const forename = 'newUserFore' + generateRandom.generateRandom(); const surename = 'newUserSur' + generateRandom.generateRandom(); const username = 'newUserUser2' + generateRandom.generateRandom(); const password = 'Pass@123' + generateRandom.generateRandom(); userCreate.addUserWithPassword(forename, surename, username, password); // select language userCreate.selectDropdownByNumber(userCreate.mylang, 1); // select role userCreate.selectDropdownByNumber(userCreate.myrole, 1); // click add userCreate.addUserButton.click(); browser.wait(until.presenceOf(userCreate.successMessage, 5000, 'Timed out')); expect(userCreate.successMessage.getText()).toContain('User saved successfully!'); // cancelbutton userCreate.cancelbutton.click(); browser.wait(until.presenceOf(userOverview.addUserButton, 5000, 'Timed out')); // logout indexPage = homePage.menu.navigateTo(MenuOption.LOGOUT, until); // click on login button on first page loginPage = indexPage.loginButtonClickedOnBasePage(); // login with the credentials browser.wait(until.presenceOf(loginPage.loginTitle, 5000, 'Timed out')); loginPage.login(username, password); browser.wait(until.presenceOf(menu, 5000, 'Timed out')); expect(menu.isDisplayed()).toBe(true); }); 

functiontesting文件,我首先启动服务器,然后运行ui

  #!/usr/bin/env bash echo "API: Ensuring the port $API_SERVER_PORT is freed." fuser -k -n tcp $API_SERVER_PORT echo " Starting the server in detached mode. This will take about 5 minutes the first time " cd ../api && mvn spring-boot:run -D server.port=$API_SERVER_PORT >> api-start.log 2>&1 & # Wait for the server to come up.. while ! (ncat -w 1 127.0.0.1 $API_SERVER_PORT </dev/null >/dev/null 2>&1); do sleep 1; done echo "Server started on port $API_SERVER_PORT" echo "UI: Ensuring the port $UI_SERVER_PORT is freed." fuser -k -n tcp $UI_SERVER_PORT npm start >> ui-start.log 2>&1 & while ! (ncat -w 1 127.0.0.1 $UI_SERVER_PORT </dev/null >/dev/null 2>&1); do sleep 1; done echo "Angular app is running on port $UI_SERVER_PORT , startup logs is in start.log". protractor container.protractor.conf.js 

你试过把主机的/dev/shm到容器上吗?

https://github.com/SeleniumHQ/docker-selenium#running-the-images

这显然是一个已知的解决方法,以阻止selenium与Docker中的Chrome或Firefox崩溃。 selenium的崩溃并不是很明显,只是通过茉莉花超时expression。