【问题标题】:Element click is intercepted in the following 'it' block [duplicate]元素点击在以下“it”块中被拦截[重复]
【发布时间】:2020-02-06 21:18:47
【问题描述】:

所以我有这个问题,真的让我发疯。在 Angular 应用程序中,单击保存按钮后,会出现一条 toast 消息。在显示 toast 时,它与带有注销按钮的用户菜单重叠。最终 toast 被删除(也从 DOM 中),我可以注销。然后问题出在第一个“it”块中,它运行良好,它等待 toast 消失,然后单击菜单并注销。但是当第二个'it'块运行时,基本上使用相同的代码,它只是刹车并给出错误Failed: element click intercepted: Element class="nav-link user-name" data-toggle="dropdown">...</a> is not clickable at point (1714, 31). Other element would receive the click: <div aria-live="polite" role="alertdialog" class="toast-message...。有时它甚至会在第一个“it”块中刹车。

这是我使用的函数:

async waitForToastToDisappear() {
let toast = element(by.xpath('//*[@id="toast-container"]/div'));
await browser.wait(ExpectedConditions.invisibilityOf(toast), 10000, 'Toast message did not completely disappear');

我也试过stalenessOf,但效果一样。

这是实际测试

beforeEach(async function() {
await login.loginToApp('sysadmin', 'sysadmin');

afterEach(async function() {
await login.loginOut();

it('should change the date, navigate to screen and add record', async function () {
await calendar.setDefaultTestDate();

await browser.get(screenUrl);
await browser.wait(ExpectedConditions.visibilityOf(firstTab), 10000, 'Tab not fully loaded');

await elem.first().sendKeys('12');
await element(by.css('div.btn.btn-primary.btn-sm')).click();
await page.clickElement(element(by.cssContainingText('.navbar-brand li a', 'Home')));
await page.waitForElement(element(by.css('.main-view')));
await page.waitForToastToDisappear();

值得一提的是,我还在loginToApp 中使用browser.waitForAngularEnabled(false); 进行登录,因为登录页面不是Angular 并且我已经读到它可能会导致一些测试不稳定,但我是不确定...

【问题讨论】:

    标签: angular selenium protractor e2e-testing


    【解决方案1】:

    我看到的几种方法:

    1. 只需将常规 logoutButton.click() 替换为
    browser.executeScript(
      "arguments[0].click();",
      $logoutButton.getWebElement()
    )
    

    不管页面布局如何,它都会点击元素

    1. 对它进行残酷处理 :) 并编写一个函数从 DOM 中删除该元素,如果它不是您的测试的一部分。像这样:
    let removeMessage = async function () {
      if (await message.isPresent()) {
        await browser.executeScript('return arguments[0].remove()', message.getWebElement());
      }
    }
    

    然后将其添加到您的afterAll()

    如果由于某种原因这些对您不起作用,lmk 我们将尝试调试您的测试中出现的问题

    【讨论】:

    • 您好,感谢您的提示。我尝试了第一个,它看起来确实很有希望,但后来我得到了同样的错误。似乎测试只是随机失败。有一次它们都通过了,如果我在 5 分钟内再次运行它们,它们就会失败,因为点击被拦截....对于第二个提示,我不明白代码的实际作用以及为什么要将其添加到 @987654325 @?
    • 如果您在 chrome 中打开开发控制台,可以说,您可以选择任何元素,右键单击它并从 DOM 中删除,就像它从未存在过一样。第二个代码的作用是删除与按钮重叠的消息。文我说把它添加到afterAll 我的意思是把它放在logout() 方法之前,以确保退出前的元素不在DOM中
    猜你喜欢
    • 2019-11-08
    • 2022-01-05
    • 2021-09-04
    • 2021-05-03
    • 2021-10-28
    • 1970-01-01
    • 2020-02-23
    • 2020-01-04
    • 2021-10-08
    相关资源
    最近更新 更多