2016-10-13 148 views
1

我是新來的Selenium,我想我只是不理解代碼和瀏覽器中發生了什麼。我可以通過用driver.sleep(1000)替代driver.wait代碼(發佈如下)來解決我的問題,但我一直在閱讀睡眠語句並不理想。WebdriverJS ElementNotVisibleError:元素不可見

有人能幫我弄清楚爲什麼我的代碼不工作,到底發生了什麼?如果有幫助,我可以提供完整的堆棧跟蹤。

下面是代碼的樣子。

const webdriver = require('selenium-webdriver') 
const chrome = require("selenium-webdriver/chrome"); 
const By = webdriver.By 
const until = webdriver.until 

var username = "XXX" 
var password = "XXX" 

function login(username, password) {  
    // This part works fine 
    driver.wait(until.elementLocated(By.id('Email'))) 
    driver.findElement(By.id('Email')).sendKeys(username) 
    driver.findElement(By.id('next')).click() 

    // Here is where the element not visible happens 
    driver.wait(until.elementLocated(By.id('Passwd')), 5000) 
    // driver.sleep(1000) works but I'm not sure why? 
    driver.findElement(By.id('Passwd')).sendKeys(password) 

    // Login 
    driver.findElement(By.id('signIn')).click() 
} 

var driver = new webdriver.Builder() 
     .withCapabilities({'browserName': 'chrome'}).build() 
driver.get('https://gmail.com') 
login(username, password) 

更新:

每建議,我嘗試使用elementIsVisible功能等待元素變得可見,通過下面的代碼。

driver.wait(until.elementIsVisible(driver.findElement(By.id('Passwd')), 5000)) 

但我得到以下錯誤。

NoSuchElementError: no such element: Unable to locate element: {"method":"css selector","selector":"*[id="Passwd"]"}

+0

'.isEnabled()'通常只適用於'BUTTON'標籤被禁用/啓用。您可以嘗試等待它可見或可點擊。 – JeffC

+0

哦...和另一條評論。你想讓函數做一件事...在這種情況下,我會將'googeLogin()'改爲'login()',並取出設置驅動程序的部分並導航到谷歌。讓它只處理登錄部分。 – JeffC

+0

@JeffC我清理了一下代碼。我刪除了'isEnabled()'函數,但仍然看到'element not visible'錯誤。 – jmreicha

回答

2

driver.wait(until.elementIsVisible(driver.findElement(By.id('Passwd')), 5000))

其實這種說法是不正確等到元素是可見的,在此聲明driver.findElement(By.id('Passwd'))會拋出NoSuchElementError如果當時元素不存在上你所得到的DOM

你應該嘗試使用until.elementLocated(locator)等到出現在DOM慾望元素,然後再等到元素下使用until.elementIsVisible(element)可見: -

const until = webdriver.until; 

var pwd = driver.wait(until.elementLocated(By.id('Passwd')), 5000); 
driver.wait(until.elementIsVisible(pwd), 5000)).sendKeys(password)