Angular2 Karma/Protractor - 等待元素启用

Angular2 Karma/Protractor - wait for element to become enabled

在我的 Angular2 应用程序中,我有一个 Karma 单元测试,它需要等待一个元素被启用。

我的问题是我不确定如何让测试等待该元素启用后再尝试单击它。

  it('should check the fundDropdown exists', function () {

        browser.get(url);

        var menuStratItem = element(by.xpath('/html/body/alg-app/mainviewer/p-tabview/div/ul/li[2]/a'));

        // Need to wait for this element to become enabled before I try to click it...
        expect(menuStratItem.isEnabled()).toBe(true);

        menuStratItem.click();

        expect(element(by.id('fundDropdown')).isPresent()).toBe(true);
  });

如何在继续测试之前等待此元素启用?

您应该使用 browser.wait() 而不是您当前正在做的事情。这样的事情应该有效:

var ec = protractor.ExpectedConditions
var timeout = 60000;

it('should check the fundDropdown exists', function () {
    browser.get(url);

    var menuStratItem = element(by.xpath('/html/body/alg-app/mainviewer/p-tabview/div/ul/li[2]/a'));

    //use browser.wait to wait for element to be clickable
    browser.wait(ec.elementToBeClickable(menuStratItem), timeout);
    menuStratItem.click();

    expect(element(by.id('fundDropdown')).isPresent()).toBe(true);
});

我发现我必须使用 .then 调用来在条件变为真时执行代码。完整的答案看起来像这样...

  var url = 'http://uat.viewer3.web.algebris.lan';
  var ec = protractor.ExpectedConditions
  var timeout = 60000;

  it('should check the fundDropdown exists', function () {

        browser.get(url);

        var menuStratItem = element(by.xpath('/html/body/alg-app/mainviewer/p-tabview/div/ul/li[2]/a'));

        browser.wait(ec.elementToBeClickable(menuStratItem), timeout).then(function () {
              expect(menuStratItem.isEnabled()).toBe(true);
              menuStratItem.click();
              expect(element(by.id('fundDropdown')).isPresent()).toBe(true);
        });
  });

谢谢 Ben Cameron.It 为我工作。

使用 isDisplayed() 而不是 isPresent() 总是更好

 it('should check the fundDropdown exists', function () {

    browser.get(url);

    var menuStratItem = element(by.xpath('/html/body/alg-app/mainviewer/p-tabview/div/ul/li[2]/a'));

    browser.wait(ec.elementToBeClickable(menuStratItem), 10000).then(function () {
          expect(menuStratItem.isEnabled()).toBe(true);
          menuStratItem.click();

       expect(element(by.id('fundDropdown')).isDisplayed()).toBe(true);
    });

});