У меня проблемы с получением пользовательских сообщений об ошибках для работы с 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 секунд, которые я просил?