Selenium WebDriver等到元素被显示

我search了谷歌和SO网站,我得到了JAVA的答案,但似乎没有得到node.js的答案

我有一个Web应用程序需要时间来加载。 我会selenium程序等待页面加载,然后执行一些操作。

我目前的代码如下

//dependencies var webdriver = require('selenium-webdriver'), util = require('util'), _ = require('underscore'); var driver = new webdriver.Builder().withCapabilities(webdriver.Capabilities.chrome()).build(); var branchName = _.isUndefined(process.argv[3]) ? 'branch' : process.argv[3], hostName = _.isUndefined(process.argv[2]) ? 'localhost' : process.argv[2], appTmpl = 'http://%s/%s', username = 'xxxx', password = 'xxxx'; var appUrl = util.format(appTmpl, hostName, branchName); driver.get(appUrl); driver.findElement(webdriver.By.name("username")).sendKeys(username); driver.findElement(webdriver.By.name("password")).sendKeys(password); driver.findElement(webdriver.By.name("login_button")).click(); driver.quit(); 

我得到的错误是:

  C:\Work\study\selenium\node_modules\selenium-webdriver\lib\webdriver\promise.js:1643 throw error; ^ NoSuchElementError: no such element (Session info: chrome=37.0.2062.103) (Driver info: chromedriver=2.10.267521,platform=Windows NT 6.1 SP1 x86_64) at new bot.Error (C:\Work\study\selenium\node_modules\selenium-webdriver\lib\atoms\error.js:109:18) at Object.bot.response.checkResponse (C:\Work\study\selenium\node_modules\selenium-webdriver\lib\atoms\response.js:106:9) at C:\Work\study\selenium\node_modules\selenium-webdriver\lib\webdriver\webdriver.js:277:20 at C:\Work\study\selenium\node_modules\selenium-webdriver\lib\goog\base.js:1243:15 at webdriver.promise.ControlFlow.runInNewFrame_ (C:\Work\study\selenium\node_modules\selenium-webdriver\lib\webdriver\promise.js:1539:20) at notify (C:\Work\study\selenium\node_modules\selenium-webdriver\lib\webdriver\promise.js:362:12) at notifyAll (C:\Work\study\selenium\node_modules\selenium-webdriver\lib\webdriver\promise.js:331:7) at resolve (C:\Work\study\selenium\node_modules\selenium-webdriver\lib\webdriver\promise.js:309:7) at fulfill (C:\Work\study\selenium\node_modules\selenium-webdriver\lib\webdriver\promise.js:429:5) at C:\Work\study\selenium\node_modules\selenium-webdriver\lib\webdriver\promise.js:1406:10 ==== async task ==== WebDriver.findElement(By.name("username")) at webdriver.WebDriver.schedule (C:\Work\study\selenium\node_modules\selenium-webdriver\lib\webdriver\webdriver.js:268:15) at webdriver.WebDriver.findElement (C:\Work\study\selenium\node_modules\selenium-webdriver\lib\webdriver\webdriver.js:711:17) at Object.<anonymous> (C:\Work\study\selenium\test.js:15:8) at Module._compile (module.js:456:26) at Object.Module._extensions..js (module.js:474:10) at Module.load (module.js:356:32) at Function.Module._load (module.js:312:12) at Function.Module.runMain (module.js:497:10) at startup (node.js:119:16) 

我偶然发现了我的问题的答案

所以要等待一个元素出现,我们必须:

 driver.wait(function () { return driver.isElementPresent(webdriver.By.name("username")); }, timeout); 

你可以在webdriver.wait使用then()来注册一个监听器,

 return driver.wait(until.elementLocated(By.name('username')), 5 * 1000).then(el => { return el.sendKeys(username); }); 

尝试这样的事情:

 function isItThere(driver, element){ driver.findElement(webdriver.By.id(element)).then(function(webElement) { console.log(element + ' exists'); }, function(err) { if (err.state && err.state === 'no such element') { console.log(element + ' not found'); } else { webdriver.promise.rejected(err); } }); } 

我根据我在这里find的东西稍微调整它: 检查元素是否存在 – selenium/ JavaScript /节点 – JS和它的魅力。

你不需要一个自定义函数,你可以这样做:

  let el = driver.findElement(By.id(`import-file-acqId:${acqId}`)); driver.wait(until.elementIsVisible(el),100); return el.sendKeys(file); 

请参阅这里的文档:

https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/until.html

这是唯一为我工作的东西:

 const element = By.id('element'); driver.wait(until.elementLocated(element)); const whatElement = driver.findElement(element); driver.wait(until.elementIsVisible(whatElement), 5000).click(); 

编写asynchronous函数来避免这个问题

 (async function() { let url = args[0]; await driver.get(url); driver.quit(); })();