Как я могу поймать ошибки Selenium, используя WebDriverJS
Поэтому я использую JavaScript-реализацию Selenium, WebDriverJS. Как и при любой автоматизации веб-браузера, самым большим препятствием является замедление кода, достаточное для загрузки элементов страницы. Мое решение таково:
для каждого элемента, с которым я хочу взаимодействовать, у меня есть такой блок кода
xpath = "//div[@id='gs_lc0']/input[@id='gbqfq']"
driver.wait(function(){
return waitForElement(xPath,driver);
});
try{
element = driver.findElement(webdriver.By.xpath(xPath));
}catch(e){
console.log("Wait Function False Positive")
}
element.sendKeys("Let Me Google That For You\n";
с этим, как функция повторяется в функции ожидания
var waitForElement = function(path, driver){
console.log("try: " + path)
try{
driver.findElement(webdriver.By.xpath(path));
}catch (e){
console.log("FAILURE")
return false;
}
console.log("SUCCESS")
return true;
}
теперь этот код иногда будет работать, а иногда нет. Я предполагаю, что функция ожидания не работает вообще, и я просто получаю счастливое время загрузки веб-страницы. Таким образом, чтобы проверить эту теорию, я добавил функцию try в блок кода, который я не могу даже поймать "NoSuchElementError". Таким образом, главный вопрос моего вопроса заключается в том, существует ли какой-либо другой способ сформировать функцию tryCatch, чтобы эти ошибки были обнаружены.
Также вот как выглядит глава моего кода, если вы хотите полное воспроизведение
var webdriver = require('selenium-webdriver'), element
var driver = new webdriver.Builder().
withCapabilities(webdriver.Capabilities.chrome()).
build();
driver.get('google.com');
3 ответа
Предложение бубликмейкер об использовании findElements
не плохой Обычно это то, что я делаю, когда хочу проверить, существует ли элемент, а не возиться с исключениями.
Однако, для полноты картины, вот как вы будете иметь дело с ошибкой, генерируемой, когда элемент не существует:
var webdriver = require('selenium-webdriver');
var driver = new webdriver.Builder().
withCapabilities(webdriver.Capabilities.chrome()).
build();
driver.get('http://www.google.com');
driver.findElement(webdriver.By.id("fofofo")).then(null, function (err) {
if (err.name === "NoSuchElementError")
console.log("Element was missing!");
});
driver.quit();
Второй аргумент then
это ошибка, которая называется, если findElement
выходит из строя. Так как selenium-webdriver
работает с обещаниями, вот как вы должны поймать ошибку. С помощью try...catch
не может работать, потому что Selenium не начинает работать сразу же; работа, с которой вы просите Selenium findElement
выполняется в неопределенное время в будущем. К тому времени выполнение JavaScript вышло бы из вашего try...catch
,
Приведенный выше код ищет элемент с id
ценность fofofo
, который не существует и терпит неудачу.
Вы также можете отловить эту ошибку в цепочечном методе "catch":
driver.findElement(webdriver.By.id("fofofo")).then(() => {
// do some task
}).catch((e) => {
if(e.name === 'NoSuchElementError') {
console.log('Element not found');
}
})
Я бы порекомендовал читать по явным и неявным ожиданиям. Итоговое явное ожидание будет опрашивать веб-сайт до тех пор, пока не будет выполнено определенное условие, в то время как неявное ожидание носит более общий характер и будет ожидать указанное количество времени для выполнения команды. В вашем случае я бы сослался на этот предыдущий вопрос, который был решен с помощью:
driver.wait(function() {
return driver.findElement(webdriver.By.xpath(xPath)).isDisplayed();
}, timeout);
ИЛИ ЖЕ
driver.wait(function() {
return driver.isElementPresent(locator);
}, timeout);
Пожалуйста, прокомментируйте, если есть какие-либо разъяснения, которые вам нужны.
РЕДАКТИРОВАТЬ:
Я ошибся вопросом. Альтернативный метод, чтобы поймать NoSuchElementError, состоит в том, чтобы использовать метод findElements
который задокументирован здесь, и имеет пример реализации здесь. Если элемент не существует, он вернет список размером 0. Таким образом, исключение не выдается, и вы можете определить, существует ли он по размеру списка.
Я надеюсь, что это лучший ответ на ваш вопрос.