gpt4 book ai didi

Angular-Protractor-Headless Chromium : When using APP_INITIALIZE, 在页面上找不到 Angular

转载 作者:太空狗 更新时间:2023-10-29 17:40:17 27 4
gpt4 key购买 nike

我们正在构建一个 Ionic 混合应用程序,并且我们实现了由 CI 系统运行的自动化 E2E 测试。所有这些测试一直正常工作,直到我们在我们的“app.module”中实现 APP_INITIALIZE 以在初始化之前获取浏览器语言。

这是我们 APP_INITIALIZE 实现的脏代码:

-app.module.ts

export function configurateLocaleData(dynamicRegisterLocaleService: DynamicRegisterLocaleService): () => Promise<any> {
return () => dynamicRegisterLocaleService.configurateLocaleData();
}

...

providers: [

...


{
provide: APP_INITIALIZER,
useFactory: configurateLocaleData,
deps: [ DynamicRegisterLocaleService ],
multi: true
}
...

-动态注册-locale.service.ts

import {Injectable} from "@angular/core";
import {HttpClient} from "@angular/common/http";
import {AppConfig} from "../app.constants";
import {DateLocaleService} from "./dateLocale.service";
import {registerLocaleData} from "@angular/common";

@Injectable()
export class DynamicRegisterLocaleService {

constructor(private httpClient: HttpClient) {
}

public configurateLocaleData(): Promise<any> {
let currentLang = DateLocaleService.getLanguage();
return this.httpClient.get("../assets/locales/" + currentLang + ".js", {responseType: "text"}).toPromise()
.then(data => {
const startPos = data.indexOf(AppConfig.EXPORT_DEFAULT);
let localeText = "return " + data.substring(startPos + AppConfig.EXPORT_DEFAULT.length);
registerLocaleData((new Function(localeText))());
});
}
}

这些是我们正在运行的一些 Protractor cucumber 测试及其配置:

-cucumber.conf.js

exports.config = {
allScriptsTimeout: 70000,
framework: 'custom',
frameworkPath: require.resolve('protractor-cucumber-framework'),

directConnect: true,
restartBrowserBetweenTests: true,
capabilities: {
'browserName': 'chrome',
'chromeOptions': {
'args': ['--disable-web-security', '--headless', '--disable-gpu', '--no-sandbox'],
'perfLoggingPrefs': {
'enableNetwork': true,
'enablePage': false
}
},
loggingPrefs: {
performance: 'ALL',
browser: 'ALL'
}
},

specs: [
'../e2e/cucumber/features/*.feature'
],

cucumberOpts: {
require: ['../e2e/cucumber/steps/*.steps.js'],
strict: true
},
};

- cucumber .steps.js

var TestsCfg = require("./../tests.constants.js");
var SupportFunctions = require("./../support/support-functions.js");

var {defineSupportCode, After} = require("cucumber");
var chai = require("chai").use(require("chai-as-promised"));
var expect = chai.expect;

defineSupportCode(function({setDefaultTimeout, When, Then, Given, And}) {
setDefaultTimeout(TestsCfg.CUCUMBER_STEPS_MAX_TIMEOUT_MS);

After(function() {
return browser.manage().logs().get('browser').then(function(browserLogs) {
console.log("Console logs for this scenario: ");
browserLogs.forEach(function(log){
console.log(log.message);
});
});
});

When("I navigate to App", function() {
return browser.get(TestsCfg.APP_TEST_URL);
});

Then("the title should be {string}", function(title) {
return expect(browser.getTitle()).to.eventually.eql(title);
});

Given("I should be able to login as {string}", function(username) {
var usernameInput = element.all(by.css(".login-input .text-input")).get(0).getWebElement();
var passwordInput = element.all(by.css(".login-input .text-input")).get(1).getWebElement();
var loginButton = element(by.id("loginButton"));

return browser.wait(SupportFunctions.isElementVisible(loginButton)).then(function() {
usernameInput.click();
usernameInput.sendKeys(username);
passwordInput.click();
passwordInput.sendKeys(pass);

return loginButton.click();
});
});

Then("the dashboard should be shown for house {string}", function(house) {
var headerSpan = element(by.css(".header-text"));

return browser.wait(SupportFunctions.isElementVisible(headerSpan)).then(function() {
return expect(headerSpan.getText()).to.eventually.eql(house);
});
});

还有更多测试,但所有测试都以相同的方式工作。我们转到所需的 URL,我们登录,然后运行特定测试。由于它是一个 Ionic 应用程序,它们都有 ExpectedConditions,所以它会等到一切都正确加载。

问题是,所有这些测试都在本地正常运行,并且在实现 APP_INITIALIZE 之前,它们也在我们的 CI 系统中运行。一旦实现了 APP_INITIALIZE,这些错误就开始出现在每一个测试中:

enter image description here

我们的 CI 是 Bitbucket Pipelines,运行一个 Docker 镜像 weboaks/node-karma-protractor-chrome:debian-node8,其中包含一个 Chromium 版本 64.0.3282.119。我们使用 chromedriver 2.37,这是与 Chromium 64 兼容的最新版本。

这些是我们从测试中得到的事实:

  • 我们知道它与 APP_INITIALIZE 相关,因为如果我们删除该实现,一切正常。
  • 我们还知道,在没有 "--headless" 标志的情况下运行 Protractor-Cucumber 时它工作正常。
  • 它在使用 Chromium v​​66 时也有效,即使是 headless 的。但它不适用于 Chromium 64.0.3282.119。

有谁知道这是 Angular、Protractor 还是 Chromium 的错误?

谢谢!

最佳答案

Protractor 有禁用此等待的方法。 浏览器.waitForAngularEnabled(false);我将它放在 onPrepare 中的 config 文件中,例如

  onPrepare: async () => {
await browser.waitForAngularEnabled(false);
},

您也可以尝试在开始时将其直接放入您的测试中。

关于Angular-Protractor-Headless Chromium : When using APP_INITIALIZE, 在页面上找不到 Angular,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50695822/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com