2014-09-09 21 views
23
angezeigt

Ich habe bei Google gesucht und die SO-Website und ich bekomme Antworten für JAVA aber scheinen nicht Antworten für node.js zu bekommenSelen WebDriver bis Element warten wird

Ich habe eine Web-Anwendung, die Zeit in Anspruch nimmt zu laden . Ich würde Selen Programm warten bis die Seite geladen ist und dann einige Aktionen durchführen.

Mein aktueller Code ist wie folgt

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

Der Fehler, den ich bekommen ist:

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

Ist Ihre Seite, die Ajaxanfragen bearbeitet? Wenn ja, haben Sie daran gedacht, javascriptexecutor in java zu verwenden, um node.js Flags für die Anfrage zu prüfen? – Fahim

Antwort

36

ich auf eine Antwort auf meine Frage gestolpert

Also für ein Element zu warten, erscheinen wir müssen:

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

Danke für die Antwort. – KodingKid

+12

Die 'isElementPresent'-Funktion wurde in 3.0 als veraltet eingestuft, daher wird dies in neueren Versionen nicht funktionieren. – jmreicha

+0

@jmreicha Kannst du Licht auf das werfen, was in den neueren Versionen funktioniert? –

18

Sie können einen Listener auf webdriver.wait registrieren, indem then()

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

Probieren Sie etwas wie dies mit:

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

Ich passte es leicht auf, was fand ich hier: Check if element exists - selenium/javascript/node-js und es funktionierte einen Reiz.

3

Sie keine benutzerdefinierte Funktion benötigen, können Sie dies nur tun:

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

die Dokumentation finden Sie hier:

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

+0

Dies ist eine aktuelle und idiomatische Lösung, die funktioniert. Sollte viel höher gewählt werden! – jaredsk

0

Schreiben asynchrone Funktion dieses Problem zu vermeiden

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

Th Ist das einzige Ding, das für mich arbeitet:

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