Как я могу поймать ошибки 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. Таким образом, исключение не выдается, и вы можете определить, существует ли он по размеру списка.

Я надеюсь, что это лучший ответ на ваш вопрос.

Другие вопросы по тегам