2014-09-09 36 views
23

Google'da aramış ve SO ve ben JAVA için cevaplar almak site ama node.js Selenyum

Ben yük zaman alır bir web uygulaması var için cevap almak için görünmüyor görüntülenir . Selenium programının, sayfa yüklenene kadar beklemesini ve ardından bazı eylemleri gerçekleştirmesini isterim. aşağıdaki gibi

Benim şu anki kodudur

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

alıyorum hatadır:

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

Siteniz ajax isteklerini ele alıyor mu? Öyleyse, java'da javascriptexecutor sınıfını kullanarak istek için node.js işaretlerini kontrol etmeyi düşündünüz mü? – Fahim

cevap

36

Sorumun cevabını tökezledi

Yani görünmesi için bir element için beklemek Bunu yapmak zorundayız:

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

Cevabınız için teşekkürler. – KodingKid

+12

"isElementPresent" işlevi 3.0 sürümünde kullanımdan kaldırıldı, bu nedenle daha yeni sürümlerde çalışmaz. – jmreicha

+0

@jmreicha, daha yeni sürümlerde neyin işe yaradığını açıklayabilir misiniz? –

18

Sen then()

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

kullanarak webdriver.wait üzerinde bir dinleyici kaydedebilirsiniz böyle bir şey deneyin:

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

ben biraz burada ne buldum dayanarak uyarlanmış: Check if element exists - selenium/javascript/node-js ve bir çekicilik çalıştı.

3

Özel bir işlevi gerekmez, sadece bunu yapabilirsiniz:

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

burada docs bakınız: Bu sorunu önlemek için asenkron fonksiyonunu Yazma

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

+0

Bu, çalışmakta olan güncel ve idiomatik bir çözümdür. Çok daha yüksek oy verilmesi gerekiyor! – jaredsk

0

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

Th Benim çalıştığım tek şey:

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