2014-09-09 23 views
23

Ho cercato su Google e il SO sito e ottenere risposte per Java, ma non sembrano avere risposte per node.jsselenio WebDriver aspettare fino elemento viene visualizzato

Ho una web app che richiede tempo per caricare . Avrei il programma di selenio per aspettare fino a quando la pagina è stata caricata e quindi eseguire alcune azioni.

Il mio codice attuale è la seguente

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

L'errore che ottengo è:

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) 
+0

Il tuo sito gestisce richieste ajax? Se sì hai pensato di usare la classe javascriptexecutor in java per controllare i flag node.js per la richiesta? – Fahim

risposta

36

sono incappato in una risposta alla mia domanda

Quindi, per aspettare che un elemento di apparire dobbiamo:

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

Grazie per la risposta. – KodingKid

+12

La funzione 'isElementPresent' è stata deprecata in 3.0, quindi non funzionerà nelle versioni più recenti. – jmreicha

+0

@jmreicha puoi far luce su ciò che funziona nelle versioni più recenti? –

18

È possibile registrare un ascoltatore in webdriver.wait utilizzando then()

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

provare qualcosa di simile:

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

mi sono adattato leggermente in base a quello che ho trovato qui: Check if element exists - selenium/javascript/node-js e ha funzionato un fascino.

0

scrittura funzione asincrona per evitare questo problema

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

Th è l'unica cosa che funziona per me:

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