WebdriverJS ElementNotVisibleError:元素不可见

时间:2016-10-13 18:00:00

标签: node.js selenium selenium-webdriver

我是Selenium的新手,我想我只是不了解代码和浏览器中发生的事情。我可以通过用driver.sleep(1000)替换driver.wait代码(下面发布)解决我的问题,但我一直在读睡眠语句并不理想。

有人可以帮我弄清楚为什么我的代码不起作用以及究竟发生了什么?如果它有用,我可以提供完整的堆栈跟踪。

这是代码的样子。

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:没有这样的元素:无法找到元素:{"方法":" css选择器","选择器":" * [id ="的passwd"]"}

1 个答案:

答案 0 :(得分:3)

  

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)