无法在量角器 e2e 测试中找到 MatSnackBar 元素

Unable to locate MatSnackBar element in protractor e2e test

我无法使用量角器定位 MatSnackBar 元素。

我是这样展示小吃店的。

const snackBarRef = this.snackBar.open('Book added.', 'Undo', {
  duration: 300000
});

这是e2e测试。

const snackBar = element(by.tagName('simple-snack-bar'));
browser.wait(ExpectedConditions.visibilityOf(snackBar), 30000);
element(by.tagName('simple-snack-bar')).getText().then(function (val) {
  console.log(val);
  expect(val).toEqual('Book added');
});

测试代码失败并出现此错误。 Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.

超时是从 browser.wait 的 30 秒开始,因此应用程序无法在该时间内找到元素。所以增加超时时间:

将下面 属性 添加到您的配置文件中:

jasmineNodeOpts: {defaultTimeoutInterval: 40000}

关于找不到元素

  1. 确保 elemnt 不在 iframe 或 shadown 中,如果是,则在访问它之前切换到 parent

  2. 正确使用 promise 链或改用 await

  it('should find an element by text input model', async function() {
    await browser.get('app/index.html#/form');

    var username =element(by.model('username'));
    await username.clear();
    await username.sendKeys('Jane Doe');

    var name = element(by.binding('username'));

    expect(await name.getText()).toEqual('Jane Doe');

  });

感谢您的留言,@dplavcic。 我的代码不起作用的原因是 snackbar 不在 angular 根目录下。所以我不得不使用browser.driver.findElement()而不是element(),终于解决了这个问题。

类似于:

public getSnackBar(): promise.Promise<string> {
    const snackbar = browser.driver.wait(until.elementLocated(By.tagName('simple-snack-bar')), 10000);

    return snackbar.getText();
}```