2015-02-20 3 views
5

Так что я использую реализацию JavaScript Selenium, WebDriverJS. Как и при любой автоматизации веб-браузера, самым большим препятствием является то, что код замедляется достаточно долго, чтобы загружать элементы страницы. Мое решение заключается в следующем:Как поймать Selenium Errors с помощью 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; 
} 

теперь это код будет работать иногда, но в других случаях это не будет. Я полагаю, что функция wait не работает вообще, и мне просто повезло время загрузки веб-страницы. Поэтому, чтобы проверить эту теорию, я добавил функцию try к блоку кода, который я даже не могу получить, чтобы поймать «NoSuchElementError». Поэтому основной вопрос моего вопроса заключается в том, есть ли другой способ сформировать функцию tryCatch, чтобы эти ошибки были пойманы.

Также здесь как выглядит голова моего кода, как если нужен полное воспроизводство

var webdriver = require('selenium-webdriver'), element 

var driver = new webdriver.Builder(). 
    withCapabilities(webdriver.Capabilities.chrome()). 
    build(); 

driver.get('google.com'); 

ответ

12

предложение изготовителя бублика с использованием 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 является errback, который вызывается, если findElement выходит из строя. Потому что selenium-webdriver работает с обещаниями, так вы должны поймать ошибку. Использование try...catch не может работать, потому что Selenium не начинает работать сразу; работа, которую вы просите Selenium делать с findElement, выполняется в неопределенное время в будущем. К тому времени выполнение JavaScript переместилось бы из вашего try...catch.

В приведенном выше коде выполняется поиск элемента с id значением fofofo, который не существует и не работает.

+0

Благодарим вас за ответ. Решение по обработке ошибок было именно тем, что мне нужно. – Arcv2

+0

Какова цель null в инструкции then? – Arcv2

+0

Первым аргументом 'then' обычно является обратный вызов, который вызывается, если обещание успешно разрешается. Поскольку демонстрация выше не может быть успешной, нет никакого смысла в обратном вызове. Поэтому используется «null». Он будет работать так же, как и с функцией function() {} '. – Louis

1

Я рекомендовал бы читать на explicit and implicit waits. Сводные, явные ожидания будут опроса веб-сайта до тех пор, пока не будет заполнено конкретное условие, в то время как неявное ожидание будет более общим и будет ждать определенное количество времени для выполнения команды. В вашем случае, я хотел бы сослаться на этот previous question, которая была решена с помощью:

driver.wait(function() { 
    return driver.findElement(webdriver.By.xpath(xPath)).isDisplayed(); 
}, timeout); 

ИЛИ

driver.wait(function() { 
    return driver.isElementPresent(locator); 
}, timeout); 

Прокомментируйте, если есть какие-либо разъяснения вам нужно.

EDIT:

сочтя вопрос. Альтернативный способ захвата NoSuchElementError заключается в использовании метода findElements, который документирован here, и имеет пример реализации here. Если ни один элемент не существует, он вернет список размера 0. Таким образом, исключение не выбрасывается, и вы можете определить, существует ли он по размеру списка.

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

+0

бы не вариант 1 выдаст ошибку, если элемент не был там? – Arcv2

+0

Если этот параметр никогда не появляется во время таймаута, он выдает ошибку. Идея состоит в том, что вы можете установить тайм-аут равным примерно 3000, и поэтому для элемента появится 3-секундный буфер. – bagelmakers

+0

Извините, похоже, я неправильно понял вас, я отредактировал его так, чтобы это был полный ответ. – bagelmakers

0

Вы также можете поймать эту ошибку в методе прикованного «поймать»:

driver.findElement(webdriver.By.id("fofofo")).then(() => { 
    // do some task 
}).catch((e) => { 
    if(e.name === 'NoSuchElementError') { 
     console.log('Element not found'); 
    } 
}) 
Смежные вопросы