I have searched on Google and the SO site and I get answers for JAVA but do not seem to get answers for node.js
I have a web app that takes time to load. I would like the selenium program to wait till the page is loaded and then perform some actions.
My current code is as follows
//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();
The error I get is:
C:Workstudyseleniumnode_modulesselenium-webdriverlibwebdriverpromise.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:Workstudyseleniumnode_modulesselenium-webdriverlibatomserror.js:109:18) at Object.bot.response.checkResponse (C:Workstudyseleniumnode_modulesselenium-webdriverlibatomsresponse.js:106:9) at C:Workstudyseleniumnode_modulesselenium-webdriverlibwebdriverwebdriver.js:277:20 at C:Workstudyseleniumnode_modulesselenium-webdriverlibgoogbase.js:1243:15 at webdriver.promise.ControlFlow.runInNewFrame_ (C:Workstudyseleniumnode_modulesselenium-webdriverlibwebdriverpromise.js:1539:20) at notify (C:Workstudyseleniumnode_modulesselenium-webdriverlibwebdriverpromise.js:362:12) at notifyAll (C:Workstudyseleniumnode_modulesselenium-webdriverlibwebdriverpromise.js:331:7) at resolve (C:Workstudyseleniumnode_modulesselenium-webdriverlibwebdriverpromise.js:309:7) at fulfill (C:Workstudyseleniumnode_modulesselenium-webdriverlibwebdriverpromise.js:429:5) at C:Workstudyseleniumnode_modulesselenium-webdriverlibwebdriverpromise.js:1406:10 ==== async task ==== WebDriver.findElement(By.name("username")) at webdriver.WebDriver.schedule (C:Workstudyseleniumnode_modulesselenium-webdriverlibwebdriverwebdriver.js:268:15) at webdriver.WebDriver.findElement (C:Workstudyseleniumnode_modulesselenium-webdriverlibwebdriverwebdriver.js:711:17) at Object.<anonymous> (C:Workstudyseleniumtest.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)
Advertisement
Answer
I stumbled upon an answer to my question
So to wait for an element to appear we have to:
driver.wait(function () { return driver.isElementPresent(webdriver.By.name("username")); }, timeout);