selenium-webdriver node.js:等待超时后如何处理缺少的元素(似乎无法捕获异常)

时间:2016-12-01 20:51:21

标签: javascript node.js selenium selenium-webdriver

我正在使用Node.js selenium-webdriver,我有这个恼人的问题。我有这个登录功能,填写一些字段,然后尝试通过触发一个按钮登录到一个网站。我知道登录是否成功的方法是在按钮点击后等待某个元素。我想等待5秒钟,并相应地响应来电者。

问题是wait函数抛出异常并且使用try/catch并没有帮助(异常没有被捕获并且程序退出)。

这是我的代码:

var webdriver = require('selenium-webdriver'),
  By = webdriver.By,
  until = webdriver.until;

var driver = new webdriver.Builder()
    .forBrowser('chrome')
    .build();

var timeout = 5000;

function login(username, password, callback) {
    driver.get('https://www.example.com/');

    driver.switchTo().frame(driver.findElement(By.css("iframe")));
    driver.findElement(By.name('userid')).sendKeys(username);
    driver.findElement(By.name('password')).sendKeys(password);
    driver.findElement(By.id('submit_btn')).click();

    driver.wait(until.elementLocated(By.className('indication-that-login-was-successful')), timeout).then(function(elm) {
        callback(true);
        driver.quit();
    });
}

因此,如果登录失败(例如因为密码不正确),元素indication-that-login-was-successful将永远不会出现(一件好事)。但在这种情况下,我一直在

TimeoutError: Waiting for element to be located By(css selector, .indication-that-login-was-successful) Wait timed out after 5001ms

理想情况下,我可以捕获此异常并使用false回调并退出驱动程序:

try {
    driver.wait(until.elementLocated(By.className('indication-that-login-was-successful')), timeout).then(function(elm) {
        callback(true);
        driver.quit();
    });
} catch (ex) {
   callback(false); 
   driver.quit();
}

但是如上所述,用try/catch块包装它似乎没有帮助,异常永远不会被捕获并且程序存在。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您可以尝试:

driver.wait(until.elementLocated(By.className('indication-th‌​at-login-was-success‌​ful')), 5000).then(function(elm) {
        callback(true);
        driver.quit();
    }).catch(function(ex) {
        callback(false);
        driver.quit();
    });