量角器失败:元素不可交互

时间:2018-12-11 13:13:25

标签: protractor e2e-testing

我正在为Angular 7.x应用运行E2E测试。该测试直接在我的本地计算机上运行。但是,当我将其推入仓库(GitLab)时,管道会失败并引发以下错误:

  

用户个人资料-检查并更改个人资料         -失败:元素不可交互           (会议信息:chrome = 71.0.3578.80)           (驱动程序信息:chromedriver = 2.45.615279(12b89733300bd268cff3b78fc76cb8f3a7cc44e5),platform = Linux 4.14.74-coreos x86_64)

测试用例:

it('USER PROFILE - Check and change PROFILE', () => {

    page.navigateTo();

    browser.sleep(1000);
    expect(page.getProfileEditTagName()).toMatch('app-edit-profile');

    expect(element(by.className('logged-as')).getText()).toBe( testEmail );


    browser.actions().mouseMove( element.all( by.id('editIcon-salutation') ).get(0)).click().perform().then(function () {
        browser.sleep(4000);

        element( by.className('mat-select-arrow') ).click().then(function () {

            browser.actions().mouseMove( element.all(by.className('option-value mat-option')).get(0)).click().perform();
            browser.sleep(1000);
            browser.actions().mouseMove( element.all( by.id('saveButton-salutation') ).get(0)).click().perform();
            browser.sleep(1000);

        });
    });

});

navigateTo()只是 profile.po.ts 中的一种方法:

navigateTo() {
    browser.get('/profileComponentUrl');
}

让我感到困惑的是,我什至无法本地化错误或出了什么问题,是因为它可以在本地正常工作。但是一旦我推送回购,那么它在该测试用例中就完全失败了。有提示吗?

4 个答案:

答案 0 :(得分:1)

我建议:

  • 在量角器配置new SpecReporter({ spec: { displayStacktrace: true } })中启用stacktrace,以便您可以确切地看到引发错误的元素。这不会解决问题,但至少应该为您指明正确的方向。
  • 然后,如果您使用的标签,按钮或其他隐藏/显示/禁用/启用或更改DOM视图的元素,则在调用browser.sleep(100)后添加.click()

答案 1 :(得分:0)

原因元素不可交互的原因可能是-对隐藏或模糊的元素执行操作。

您可以尝试-  1.在by.className('mat-select-arrow')).click()之后添加睡眠,因为我看到您尚未在其中添加任何等待。  2.尝试检查是否以相同的屏幕分辨率在本地计算机和Jenkins计算机上运行测试。 (这可能是元素模糊的原因)

答案 2 :(得分:0)

我发现的一个原因是滚动问题。您需要检查元素是否正确显示。它可能是隐藏的。因此,使用scrollToTop / scrollToElement / scrollToElementView等。您可以编写不同的滚动方法来更好地适应条件。

另一个原因是定位器。尝试更换定位器,切勿修剪太多。只需尝试使用全身css定位器,如果它可以正常工作,则可以正确修剪。在chrome控制台中,有时可能会起作用,但不适用于测试用例。

答案 3 :(得分:0)

我遇到同样的问题,发现this

我复制粘贴了该内容(以及其他一些小调整,例如在for循环中强制单击了上一页),并且它起作用了。我相信browser.driver.manage().window().maximize();是解决方案的一部分。