Как ждать состояния в транспортире с помощью async / await - PullRequest
0 голосов
/ 15 февраля 2019

Я переключаю свой машинописный код в транспортире, чтобы использовать async / await, и у меня есть метод verifyRow, который, как мне кажется, не работает без обещаний .then

Пробовал использовать await внутри browser.wait, а также пробовалдобавление нового Promise в browser.wait, который вызывает метод asycn

findRowByMultipleCellText определяется как асинхронный метод, который возвращает число (т.е. rowIndex)

    async verifyRow(columns: string[], values: string[], shouldFind = true, timeout = 60, refresh = false) {
    let results: boolean = false;

    const columnValueString: string = this.generateColumnValuesPrintString(columns, values);

    // Wait for the row to exist based on shouldFind
    // let rowIndex: number;

    await this.driver.wait(() => {
      return new Promise(resolve => {
      this.findRowByMultipleCellText(columns, values).then((rowIndex: number) => {
      if (rowIndex >= 0 && shouldFind === true) {
        results = true;
        logger.debug('Row EXISTS in the grid: \n' + columnValueString);
      } else if (rowIndex <= -1 && shouldFind === false) {
        results = true;
        logger.debug("Row DOESN'T exist in the grid: \n" + columnValueString);
      } else {
        if (refresh === true) {
          logger.info('Refreshing the vsphere web client main page');
          new VClientMainPage().refreshButton.click();
        }
      }
    });

    resolve(results);
  });


  //  return results;
  }, timeout * 1000);

  if (results === false) {
    if (shouldFind === true) {
      throw new Error("Row DOESN'T exist in the grid: \n" + columnValueString);
    } else {
      throw new Error('Row EXIST in the grid: \n' + columnValueString);
    }
    }
  }

Я тоже пробовал это, ноошибка существует в await this.find для await можно вызывать только в асинхронных функциях

await this.driver.wait(() => {
  let rowIndex: number = await this.findRowByMultipleCellText(columns, values);
    if (rowIndex >= 0 && shouldFind === true) {
      results = true;
      logger.debug('Row EXISTS in the grid: \n' + columnValueString);
    } else if (rowIndex <= -1 && shouldFind === false) {
      results = true;
      logger.debug("Row DOESN'T exist in the grid: \n" + columnValueString);
    } else {
      if (refresh === true) {
        logger.info('Refreshing the vsphere web client main page');
        new VClientMainPage().refreshButton.click();
      }
    }
}, timeout * 1000);

if (results === false) {
  if (shouldFind === true) {
    throw new Error("Row DOESN'T exist in the grid: \n" + columnValueString);
  } else {
    throw new Error('Row EXIST in the grid: \n' + columnValueString);
  }
}

Мне нужно findRowByMultipleCellTest, чтобы вернуть число, которое происходит, если я вызываю его вне цикла ожидания. ЕСЛИ это> =0 мы вырываемся из цикла.

Что происходит, когда у меня есть код в новом Promise, он вызывает this.find, но он никогда не достигает точки, где он возвращает значение ... почти как этот код получаетподтолкнуть к концу стека, чтобы я никогда не вырвался

1 Ответ

0 голосов
/ 18 февраля 2019

Вариант 1) Используйте Promise в browser.wait(), вам следует звонить resolve(results) внутри promise.then(), а не снаружи.

async verifyRow(columns: string[], values: string[], shouldFind = true, timeout = 60, refresh = false) {
    let results: boolean = false;

    const columnValueString: string = this.generateColumnValuesPrintString(columns, values);

    // Wait for the row to exist based on shouldFind
    // let rowIndex: number;
    await this.driver.wait(() => {

        return new Promise(resolve => {
            this.findRowByMultipleCellText(columns, values).then((rowIndex: number) => {
                if (rowIndex >= 0 && shouldFind === true) {
                    results = true;
                    logger.debug('Row EXISTS in the grid: \n' + columnValueString);
                } else if (rowIndex <= -1 && shouldFind === false) {
                    results = true;
                    logger.debug("Row DOESN'T exist in the grid: \n" + columnValueString);
                } else {
                    if (refresh === true) {
                        logger.info('Refreshing the vsphere web client main page');
                        new VClientMainPage().refreshButton.click();
                    }
                }

                resolve(results);
                // you should call resolve(..) inside then(),
                // otherwise resolve() is executed prior to 
                // the completion of findRowByMultipleCellText()'s async execution.
            });


        });


        //  return results;
    }, timeout * 1000);

    if (results === false) {
        if (shouldFind === true) {
            throw new Error("Row DOESN'T exist in the grid: \n" + columnValueString);
        } else {
            throw new Error('Row EXIST in the grid: \n' + columnValueString);
        }
    }
}

Вариант 2) Использовать только async/await enableкод краткий.

async verifyRow(columns: string[], values: string[], shouldFind = true, timeout = 60, refresh = false) {
    let results: boolean = false;

    const columnValueString: string = this.generateColumnValuesPrintString(columns, values);

    // Wait for the row to exist based on shouldFind
    // let rowIndex: number;
    await this.driver.wait(() => {

        await rowIndex: number = this.findRowByMultipleCellText(columns, values);

        if (rowIndex >= 0 && shouldFind === true) {
            results = true;
            logger.debug('Row EXISTS in the grid: \n' + columnValueString);
        } else if (rowIndex <= -1 && shouldFind === false) {
            results = true;
            logger.debug("Row DOESN'T exist in the grid: \n" + columnValueString);
        } else {
            if (refresh === true) {
                logger.info('Refreshing the vsphere web client main page');
                await new VClientMainPage().refreshButton.click();

                // Add await ahead of above click() too.
            }
        }
        return results;

     }, timeout * 1000);

    if (results === false) {
        if (shouldFind === true) {
            throw new Error("Row DOESN'T exist in the grid: \n" + columnValueString);
        } else {
            throw new Error('Row EXIST in the grid: \n' + columnValueString);
        }
    }
}
...