如何使用WebDriverJS捕获Selenium错误

Arc*_*cv2 6 javascript selenium try-catch selenium-webdriver

所以我使用的是Selenium的JavaScript实现,WebDriverJS.与任何Web浏览器自动化一样,最大的障碍是让代码减慢足够长的时间以加载页面元素.我的解决方案是:

对于我想与之交互的每个元素,我都有这样的代码块

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";
Run Code Online (Sandbox Code Playgroud)

用这个函数在wait函数中重复

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;
}
Run Code Online (Sandbox Code Playgroud)

现在这个代码有时会起作用,但是它不会起作用.我觉得等待功能完全不起作用,我只是获得了幸运的网页加载时间.因此,为了测试这个理论,我将try函数添加到代码块中,甚至无法捕获"NoSuchElementError".所以我的问题首当其冲的是,是否有其他方法来形成tryCatch函数,以便捕获这些错误.

如果想要完整再现,我的代码头部也是如此

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

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

driver.get('google.com');
Run Code Online (Sandbox Code Playgroud)

Lou*_*uis 13

百吉饼制造商的使用建议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();
Run Code Online (Sandbox Code Playgroud)

第二个参数then是一个errback,如果findElement失败则调用它.因为selenium-webdriver使用promises操作,所以这是你必须捕获错误的方法.使用try...catch无法工作,因为Selenium没有立即开始工作; 你要求Selenium做的工作将findElement在未来的某个不确定的时间进行.到那个时候,JavaScript的执行已经移出你的try...catch.

上面的代码搜索id值为的元素,该元素fofofo不存在且失败.