量角器测试即使与browser.wait和helper函数也不一致

时间:2018-07-25 18:53:03

标签: protractor

我正在寻找一些建议。我已经使用量角器数周了,除非我使用browser.sleep,否则无法使我的测试保持一致。我已经尝试了辅助函数以及browser.wait(expectedCondition)。我极大地减少了browser.sleep的数量,但是量角器仍然可以快速运行。除非我有几个浏览器,否则我永远无法成功运行多个测试。睡眠只能使量角器放松一秒钟。这是一个例子: 测试,我需要选择一个用户,删除该用户,然后等待成功消息。然后,我单击同一用户,然后单击激活按钮。 结果:除非我具有browser.sleep,否则在删除/激活后,我的成功消息甚至都不会出现。测试失败,因为量角器的移动速度太快。即使符合预期条件。我的主要问题是量角器的角度网页很快。我已经尝试过ifCLickable或isDisplayed,但是它们不能完全解决问题。这是代码:

  async deleteUser() {
    await sendClick(this.getNewUser());
    await sendClick(this.getDelete());
    await waitTillPresent(this.getDeleteConfirm());
    await sendClick(this.getDeleteConfirm());
    await waitTillPresent(this.getSuccessMsg())
    expect(await page.getSuccessMsg().isDisplayed()).toBeTruthy();

  }

   async activateUser() {
    await sendClick(this.getNewUser());
    await waitTillPresent(this.getEditBtn())
    await sendClick(this.getActive());
    await waitTillPresent(this.getSuccessMsg())
    expect(await page.getSuccessMsg().isDisplayed()).toBeTruthy();

  }

功能:

  export async function sendClick(element: ElementFinder): Promise<boolean> {
    try { 
      if(!await element.isDisplayed()) {
        return false;
      }
      await browser.executeScript('arguments[0].click();', await element.getWebElement());
      return true;
    }
    catch (err) {
      return false;
    }
  }`

export async function waitTillPresent (element: ElementFinder, timeout: number = 10000) {
    return browser.wait(() => {
        return element.isPresent();

    }, timeout);
  }

我的问题:我可以正确处理吗?是否有更好的方法来确保我的测试是一致的?在进行这些测试之前,我访问了一个非角度的网页。因此,我必须添加行browser.waitForAngularEnabled(false) 这是否会影响角度的异步性质?谢谢。

1 个答案:

答案 0 :(得分:1)

最近几个月,我在e2e测试套件上工作以使其稳定。我不相信这是可能的,但是我使用了正确的等待函数,有时甚至将browser.sleep()作为最后的手段。

您有一种等待元素的正确方法。但是关于您的实现有两个问题:

1)函数waitTillPresent()的功能恰如其名。但是,如果只等到元素出现在页面上,则并不意味着该元素可以单击或显示。元素可以隐藏并且同时仍然存在。请将waitTillPresent()重命名为waitTillDisplayed()并进行如下更改:

export async function waitTillDisplayed(element: ElementFinder, timeout: number = 20000): Promise<boolean> {
    let result = await browser.wait(() => element.isPresent(), timeout);
    if(!result) {
      return false;
    }
    return await browser.wait(element.isDisplayed(), timeout);
}

2)您应该超过默认超时。将其设置得更高一些,例如20到25秒。随便玩吧。

不幸的是,我不知道browser.waitForAngularEnabled(false)如何改变测试行为。我们不使用它:)

注意:

这些功能完全相同:

function foo() { return 'hello world'; }
var foo = () => { return 'hello world'; };
var foo = () => 'hello world';

玩箭头功能,它是语法糖。

欢呼和欢呼!