Транспортир после отключения потока управления не может найти элемент - PullRequest
0 голосов
/ 31 октября 2019

Я отключил поток управления и начал распространять async / await по моим тестам e2e.

И здесь возникает проблема, что

Failed: Индекс выходит за границы. Попытка получить доступ к элементу с индексом: 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 дваждыповторить ту же последовательность и получить элемент, который я ожидал получить).

1 Ответ

1 голос
/ 31 октября 2019

getDraggableEl и getCell возвращают 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();
}
...