使用自定义工具时神秘的量角器测试失败

时间:2016-10-26 11:58:15

标签: angular protractor e2e-testing

我希望我的测试无论运行顺序如何都能正常工作。因此我创建了一个如果尚未登录就登录测试用户的工具。但是当我使用工具时,量角器行为不端。请继续阅读。 util看起来像这样:

export class E2EUtils {
  loginAndGoTo(url: string) {
    return browser.get(url).then(() => {
      return browser.driver.getCurrentUrl().then(
        (currentUrl) => {
          if (currentUrl.indexOf('/login') !== -1) {
            element(by.css('[name=email]')).sendKeys('user@email.com');
            element(by.css('[name=password]')).sendKeys('secret');
            element(by.css('login form button')).click();
          }
          expect(browser.driver.getCurrentUrl()).toMatch('.*' + url + '$');
        }, (error) => {
          console.error('error in E2EUtil.loginAndGoTo', error);
        });
    });
  };
}

使用util

的测试
import { E2EUtils } from '../e2e-utils.e2e-spec';
let utils = new E2EUtils();

describe('Home', () => {
  it('should show right profile', (done) => {
    utils.loginAndGoTo('home/user').then(() => {
      expect(element(by.css('home p')).getText()).toContain('user');
      done();
    }, (e) => { console.error('error in home.component.e2e-spec.ts', e); });
  });
});

它不起作用。它挂起并最终给出错误:

Failed: Timed out waiting for Protractor to synchronize with the page after 11 seconds. Please see https://github.com/angular/protractor/blob/master/docs/faq.md
While waiting for element with locator - Locator: By(css selector, home p)

然而。这种'相同的测试工作'。唯一的区别是我没有使用util。

  it('should show right profile-OLD', () => {
    browser.get('/home/user');
    element(by.css('[name=email]')).sendKeys('user@email.com');
    element(by.css('[name=password]')).sendKeys('secret');
    element(by.css('login form button')).click();
    expect(browser.getCurrentUrl()).toMatch('.*home/user$');
    expect(element(by.css('home p')).getText()).toContain('user');
  });

我还使用了Element Explorer并自己尝试了元素定位器,它只在不使用util时才有效。即使正确的页面可见。因此,似乎util将量角器设置为奇怪的状态。另外,我不能在util方法中使用browser.getCurrentUrl(),而是使用browser.driver.getCurrentUrl()。但是,browser.getCurrentUrl()适用于不使用util的测试。

1 个答案:

答案 0 :(得分:0)

确定。所以我找到了一个解决方法。如果我暂时添加ignoreSynchronizationsleep,我可以通过测试。像这样:

it('should show right profile', (done) => {
  browser.ignoreSynchronization = true;                                 <--
  utils.loginAndGoTo('home/user').then(() => {
    sleep(1000);                                                        <--
    expect(element(by.css('home p')).getText()).toContain('user');
    done();
  }, (e) => { console.error('error in home.component.e2e-spec.ts', e); });
});

我无法弄清楚为什么这会让它发挥作用。不知怎的,我的util方法(这是异步的)使量角器相信它必须等待角度?此外,我现在可以使用browser.getCurrentUrl代替browser.driver.getCurrentUrl。以下是ignoreSynchronization的文档

的内容
/**
   * If true, Protractor will not attempt to synchronize with the page before
   * performing actions. This can be harmful because Protractor will not wait
   * until $timeouts and $http calls have been processed, which can cause
   * tests to become flaky. This should be used only when necessary, such as
   * when a page continuously polls an API using $timeout.
   *
   * @type {boolean}
   */