【问题标题】:ScriptTimeoutError while testing angular material dropdown e2e测试角度材料下拉 e2e 时出现 ScriptTimeoutError
【发布时间】:2020-08-20 11:59:23
【问题描述】:

我有这个测试用例

it("should have list", async () => {
    // wait until list populated
    browser.wait(protractor.until.elementLocated(by.css(COMPONENT_CSS.ITEM)));

    console.log("First...............");
    try {
        await componentPage.toggleDD();
    } catch (err) {
        console.log("err", err);
    }
    console.log("Second...............");
    const count = await componentPage.getCount();
    console.log("count", count);
    expect(count).toBe(this.COUNT);
    await componentPage.toggleDD();
});

这里是toggleDD

async toggleDD(): Promise<any> {
    const _dropdown = await element(by.id(this.CSS.DD_ID));
    await _dropdown.click();
}

但这表明

err ScriptTimeoutError: script timeout
  (Session info: chrome=84.0.4147.135)
  (Driver info: chromedriver=84.0.4147.30 (48b3e868b4cc0aa7e8149519690b6f6949e110a8-refs/branch-heads/4147@{#310}),platform=Windows NT 6.3.9600 x86_64)
    at Object.checkLegacyResponse (E:\PROJECTS\NewProject\node_modules\selenium-webdriver\lib\error.js:546:15)
    at parseHttpResponse (E:\PROJECTS\NewProject\node_modules\selenium-webdriver\lib\http.js:509:13)
    at E:\PROJECTS\NewProject\node_modules\selenium-webdriver\lib\http.js:441:30
    at processTicksAndRejections (internal/process/task_queues.js:94:5)
From: Task: Protractor.waitForAngular() - Locator: By(css selector, *[id="my-dropdown"])

测试用例失败,我尝试将await 放在browser.wait 之前,尝试by.xpathby.idby.css 以获得下拉菜单。

我在调试模式下尝试过,元素存在于 DOM 上,但不知何故它没有获取元素。

检查其他元素以获取它显示的每个元素

- Failed: script timeout
    (Session info: chrome=84.0.4147.135)
    (Driver info: chromedriver=84.0.4147.30 (48b3e868b4cc0aa7e8149519690b6f6949e110a8-refs/branch-heads/4147@{#310}),platform=Windows NT 6.3.9600 x86_64)

我试过了

<div id="dummyId">Hello</div>

这个 div 由

const _divText = await element(by.id("dummyId")).getText();

即使这样我也得到 scripttimeout err

更多信息

这里是beforeAll

beforeAll(async () => {
    componentPage = new HomePage();
    helperService = new HelperService();

    COMPONENT_CSS = componentPage.CSS;
    await helperService.navigate(helperService.PAGE_URL.HOME);
    try {
        await helperService.skipIntro();
    } catch (err) {
        console.error("Intro element not found");
    }
    // browser.waitForAngular();
});

protractor.conf.js

// Protractor configuration file, see link for more information
// https://github.com/angular/protractor/blob/master/lib/config.ts

const { SpecReporter } = require("jasmine-spec-reporter");

exports.config = {
    allScriptsTimeout: 50000,
    specs: [
        "./src/login/login.component.e2e-spec.ts",
        "./src/home/home.component.e2e-spec.ts",
    ],
    capabilities: {
        "browserName": "chrome"
    },
    directConnect: true,
    baseUrl: "http://localhost:4200/",
    framework: "jasmine",
    jasmineNodeOpts: {
        showColors: true,
        defaultTimeoutInterval: 1000000,
        print: function () {
        }
    },
    onPrepare() {
        require("ts-node").register({
            project: require("path").join(__dirname, "./tsconfig.e2e.json")
        });
        jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
    }
};

【问题讨论】:

  • 乍一看,我假设这是 async / await 而不是控制流。应该等待browser.wait。我猜这就是为什么当调用toggleDD 时元素在屏幕上不可见的原因。试试看。如果你卡住了,我也可以写一个答案
  • @cnishina,试过不行
  • @cnishina 无法在演示项目中生成,虽然更新了问题,包括 protractor.conf.js 和 beforeAll 函数,任何其他方式都可以查看它
  • 抱歉,我花了一段时间才回复。它是什么样的下拉菜单?是像material.angular.io/components/select/overview 这样的有角材质下拉菜单吗?
  • @cnishina 是角材料,试图在演示项目中重现,但我无法..

标签: testing jasmine protractor angular-e2e


【解决方案1】:

查看错误,似乎在您想要与元素交互之前未显示该元素。 until.elementLocated 似乎调用了 findElements 并返回第一个元素。

https://github.com/SeleniumHQ/selenium/blob/trunk/javascript/node/selenium-webdriver/lib/until.js#L241

这意味着如果它在 DOM 中,它将返回它,但并不意味着它会显示或允许点击。 isDisplayed 调用显式检查元素是否已显示。

https://github.com/SeleniumHQ/selenium/blob/trunk/javascript/node/selenium-webdriver/lib/webdriver.js#L2296

也许可以做这样的事情?

it("should have list", async () => {
  // wait until list populated
  await browser.wait(async () => {
    return element(by.css(COMPONENT_CSS.ITEM)).isDisplayed();
  }, 10000);  // wait 10 seconds, make sure your protractor suite does not time out.

【讨论】:

  • 会尽力让你知道
  • 不工作,登录页面使用相同类型的代码,在主页之前我测试登录页面可以正常工作。尝试了 isDisplayed 不起作用,即使是带有一些 id 的静态 div,也找不到,使用了 debugger ,当控件到达调试器时,evverything 在 dom 上
  • 你有这个要在 GitHub 上试用吗?我认为这可能是帮助调试的最简单方法。
  • 一种私人项目,你可以尝试远程或通过屏幕共享在Skype上
  • 您能否创建一个示例 Angular 应用程序,其中包含可以复制您的错误的材料下拉菜单?
猜你喜欢
  • 1970-01-01
  • 2017-08-11
  • 2015-06-11
  • 1970-01-01
  • 2020-03-13
  • 2018-06-17
  • 2014-04-08
  • 1970-01-01
  • 2023-03-30
相关资源
最近更新 更多