WebdriverIO无法单击(离子)选项卡

时间:2019-07-12 22:20:07

标签: ionic-framework selenium-webdriver selenium-chromedriver webdriver-io

我正在使用WebdriverIO测试Ionic(+ Angular)应用程序上的一些基本功能。框架设置可以正常运行,但是我找不到在某些HTML元素上click的方法。例如,这是一些HTML示例:

<div class="tabbar show-tabbar" role="tablist" style="top: 166px; display: flex;">
  <a class="tab-button has-title has-title-only" href="#" role="tab" id="tab-t0-0" aria-controls="tabpanel-t0-0"
      aria-selected="true">
    <span class="tab-button-text">Blah</span>
    <div class="button-effect"></div>
  </a>
  <a class="tab-button has-title has-title-only" href="#" role="tab" id="tab-t0-1" aria-controls="tabpanel-t0-1"
      aria-selected="false">
    <span class="tab-button-text">Foo</span>
    <div class="button-effect"
        style="transform: translate3d(83px, -103px, 0px) scale(1); height: 240px; width: 240px; opacity: 0; transition: transform 395ms ease 0s, opacity 277ms ease 118ms;"></div>
  </a>
  <a class="tab-button has-title has-title-only" href="#" role="tab" id="tab-t0-2" aria-controls="tabpanel-t0-2"
      aria-selected="false">
    <span class="tab-button-text">Bar</span>
    <div class="button-effect"
        style="transform: translate3d(3px, -99px, 0px) scale(1); height: 240px; width: 240px; opacity: 0; transition: transform 395ms ease 0s, opacity 277ms ease 118ms;"></div>
  </a>
  <div class="tab-highlight animate" style="transform: translate3d(570px, 0px, 0px) scaleX(285);"></div>
</div>

这是我正在测试功能的超简单测试用例:

import { expect } from "chai";

describe("Some Test", () => {
  const logingUrl: string = "url0";

  const appUrl: string = "url1";

  it("Some Test Again", () => {
    browser.url(logingUrl);
    browser.url(appUrl);
    const tab = $("#tab-t0-2");
    tab.click();
    expect(tab.getAttribute("aria-selected")).to.equal("true");
  });
});

..但是每次我运行它时,都会收到一些奇怪的错误消息,提示该元素在某些时候不可点击。有任何线索吗?

[0-0] element click intercepted in "Some Test Again"
element click intercepted: Element <a class="tab-button has-title has-title-only" href="#" role="tab" id="tab-t0-2" aria-controls="tabpanel-t0-2" aria-selected="false">...</a> is not clickable at point (666, 170). Other element would receive the click: <ion-backdrop disable-activated="" role="presentation" tappable="" class="backdrop-no-tappable" style="opacity: 0.5;"></ion-backdrop>
  (Session info: headless chrome=75.0.3770.100)

1 个答案:

答案 0 :(得分:1)

这是经典的Angular / Ionic背景陷阱之一。

让我们从错误消息开始:元素#tab-t0-2在点(坐标)处不可点击,另一个元素将获得点击:ion-backdrop

这告诉我们,由于ion-backdrop标签在其上方呈现,因此无法单击您的目标元素。 ion-backdrop组件是一个简短的动画(通常用于模态),在这种情况下,是背景(opacity: 0.5的半暗淡。

✖解决方案1:轻松应对之道?明确希望它消失,然后单击目标元素。

it("Some Test Again", () => {
  browser.url(logingUrl);
  browser.url(appUrl);

  // Explicitly wait for the backdrop animation to disappear:
  const backdrop = $('.backdrop-no-tappable');
  backdrop.waitForExist(5000, true, 'Backdrop still present');

  const tab = $("#tab-t0-2");
  tab.click();
  expect(tab.getAttribute("aria-selected")).to.equal("true");
});

✖解决方案2:您可以尝试的另一种方法是单击tab元素,一旦该元素在DOM中完全可见且难以处理(< em>这是一种最佳做法):

  const tab = $("#tab-t0-2");
  tab.waitForDisplayed(5000);
  // For 'wdio-v4' users: 
  // tab.waitForVisible(5000);
  tab.click();
  expect(tab.getAttribute("aria-selected")).to.equal("true");