能否使用 Protractor 测试 Knockout 应用程序?

Can a Knockout app be tested with Protractor?

我正在制作一个使用 Knockout 的网页。我在看到 this post about using Protractor on non-Angular pages 后设置了 Protractor,但似乎 Protractor 不能 'see' 属于 KO 组件的任何元素。

describe('a simple test', function () {
  it('works', function () {
    browser.ignoreSynchronization = true;
    browser.get('profile');

    expect(browser.getTitle()).toEqual('Title');  // this passes (outside KO)

    expect(element(by.id('ko-component')).getText()).toEqual('Hello World!'); // this fails (inside KO)
  });
});

第二个断言导致此错误,即使该元素肯定在 HTML.

Message:
 NoSuchElementError: No element found using locator: By.id("ko-component")

如果我不会Protractor,欢迎推荐其他端到端测试框架

protractor 基本上是 WedDriverJS 的包装器(javascript selenium 绑定)。 protractor 使 AngularJS 页面的测试更容易、更自然,知道何时 angular 已解决并且页面已准备好与之交互,并引入了几个 angular 特定的定位器。

换句话说,您绝对可以用 protractor 测试 knockout 个页面。在这种情况下,您需要 explicitly wait until the ko-component element is present by using presenceOf :

var EC = protractor.ExpectedConditions;
var e = element(by.id('ko-component'));
browser.wait(EC.presenceOf(e), 10000);

expect(e.getText()).toEqual('Hello World!');