Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript selenium webdriver node.js:如何在等待超时后处理缺少的元素(异常似乎不会被捕获)_Javascript_Node.js_Selenium_Selenium Webdriver - Fatal编程技术网

Javascript selenium webdriver node.js:如何在等待超时后处理缺少的元素(异常似乎不会被捕获)

Javascript selenium webdriver node.js:如何在等待超时后处理缺少的元素(异常似乎不会被捕获),javascript,node.js,selenium,selenium-webdriver,Javascript,Node.js,Selenium,Selenium Webdriver,我正在使用Node.jsSeleniumWebDriver,我遇到了这个恼人的问题。我有这个登录功能,它填写一些字段,然后通过点击按钮尝试登录到网站。我知道登录是否成功的方法是在单击按钮后等待某个元素。我想等5秒钟,然后相应地回复来电者 问题是wait函数抛出异常,并使用try/catch绕过它,但这没有帮助(异常未被捕获,程序退出) 这是我的代码: var webdriver = require('selenium-webdriver'), By = webdriver.By, unt

我正在使用Node.js
SeleniumWebDriver
,我遇到了这个恼人的问题。我有这个登录功能,它填写一些字段,然后通过点击按钮尝试登录到网站。我知道登录是否成功的方法是在单击按钮后等待某个元素。我想等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();
    });
}
因此,如果登录不成功(例如,因为密码不正确),则表示登录成功的元素
将永远不会出现(一件好事)。但在这种情况下,我总是

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
块来结束这个过程似乎没有什么帮助,异常永远不会被捕获,程序也存在

有什么想法吗

您可以尝试:

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();
    });

嗨,林,谢谢。你的答案很好(它帮助我指出了正确的方向)。如果elementLocated函数返回promise对象,我就使用了catch函数。您可以编辑您的答案来使用它吗(这与我的问题更相关,因为我使用的是promise API)。感谢driver.wait(直到.elementLocated(By.className('indication-that-login-was-successful')),5000)。然后(函数(elm){callback(true);driver.quit();})。catch(函数(ex){callback(false);driver.quit();});我很高兴它能帮助你。我会根据你的建议更新答案