0

我已经禁用了控制流并开始在我的 e2e 测试中传播 async/await。

问题就出现了

失败:索引超出范围。尝试访问索引处的元素:0,但只有 0 个元素匹配定位器 By(css selector, .OneLine)

NoSuchElementError:索引超出范围。尝试访问索引处的元素:0,但只有 0 个元素匹配定位器 By(css selector, .OneLine)

这是我的测试

it('', async () => {
await page.dragElToCell('Text', {x: 1, y: 0});
// further some expectations that are not reached due to error thrown which points to page.dragElToCell
})

这是一个页面 obj 方法

async dragElToCell(name: string, pos: {x: number, y: number}) {
  const el = this.getDraggableEl(elName);
  const cell = this.getCell(pos.x, pos.y);
  return browser.actions().dragAndDrop(el, cell).perform();
}

getDraggableEl(name: string) {
  return element(by.cssContainingText('.draggable', name);
}

getCell(x: number, y: number) {
  return $$('.OneLine').get(y).$$('.Column').get(x);
}

这段代码在控制流中运行良好。一旦我禁用它,它就停止工作。

诀窍是,如果我执行

  expect(await $$('.OneLine').get(0).$$('.Column').get(1).isPresent()).toBeTruthy();

在我的测试套件中,它工作正常并给了我true.

我也调试过getCell,它收到了正确的数字。

此外,我设置了 10 秒的睡眠时间以确保元素可见(为此还执行querySelectorAll了两次以重复相同的序列并获得我希望检索的元素)。

4

1 回答 1

1

getDraggableElgetCell返回一个Promise. 所以你需要添加await例如dragElToCell

async dragElToCell(name: string, pos: {x: number, y: number}) {
  const el = await this.getDraggableEl(elName);
  const cell = await this.getCell(pos.x, pos.y);
  return browser.actions().dragAndDrop(el, cell).perform();
}
于 2019-10-31T14:10:39.900 回答