Selenium, кажется, игнорирует период ожидания и сообщение о тайм-ауте в driver.wait () - PullRequest
0 голосов
/ 20 февраля 2020

У меня проблемы с получением пользовательских сообщений об ошибках для работы с driver.wait() в селене (+ огурец). Определение: driver.wait(condition, timeout, message), где

  • условие является чем-то вроде until.elementLocated(By.css('.myClass'))
  • тайм-аут в мс
  • сообщение «Необязательное сообщение для использования, если ожидание время ожидания. "

Больше информации здесь под this.wait().

Насколько я понимаю, смысл API в том, что вы можете пройти период ожидания и сообщение для использования, если период ожидания истекает без выполнения условия.

Имея это в виду, я определил функцию locateElementWithTimeout, которая принимает

  • драйвер
  • локатор (что-то вроде By.css(".myClass"))
  • значение тайм-аута (что-то вроде 5000)
  • timeoutMessage (что-то вроде "my timeout message")
async function locateElementWithTimeout(driver, by, timeout, timeoutMessage) {
  // need to split into 2 as we use timeout twice
  const timeoutInHalf = Math.floor(timeout / 2); 

  const element = await driver.wait(until.elementLocated(by), timeoutInHalf, timeoutMessage);
  await driver.wait(until.elementIsVisible(element), timeoutInHalf, timeoutMessage);
  return element;
}

И я также определил функцию typeInWithTimeout

async function typeInWithTimeout(driver, by, timeout, timeoutMessage, textToType) {
  const element = await locateElementWithTimeout(driver, by, timeout,
    `Unable to locate element for typing text - ${timeoutMessage}`);

  // bridge is needed for anything apart from firefox
  const actions = driver.actions({ bridge: true });
  await actions.click(element).sendKeys(textToType).perform();
}

, называемую как

await typeInWithTimeout(driver, By.id("login_box"), 5000, 'Unable to locate login box', "myUsername");

Ранее в моем коде (~ 1 секунда выполнения ранее ) Я вызвал следующую функцию для определения таймаутов:

await driver.manage().setTimeouts({
  implicit: 50 * 1000,
  pageLoad: 50 * 1000,
  script: 50 * 1000,
});

Так что теперь к моей проблеме. Я проверяю условие сбоя, пытаясь найти элемент, который не существует, ожидая, что он выдаст ошибку с message, который я определил. Моя проблема в том, что вместо ожидания 5 секунд, которые я запросил при вызове функции, селен вместо этого ждет полные 50 секунд, а затем завершается с ошибкой Error: function timed out, ensure the promise resolves within 50000 milliseconds. Почему не происходит сбой в течение 5 секунд, которые я просил?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...