Node.js WebdriverJS ElementNotVisibleError:元素不可见

Node.js WebdriverJS ElementNotVisibleError:元素不可见,node.js,selenium,selenium-webdriver,Node.js,Selenium,Selenium Webdriver,我是Selenium的新手,我想我只是不了解代码和浏览器中发生了什么。我可以通过将driver.wait代码(张贴在下面)替换为driver.sleep(1000)来解决我的问题,但我一直在读到sleep语句并不理想 有人能帮我弄清楚为什么我的代码不起作用,到底是怎么回事吗?如果有帮助,我可以提供完整的堆栈跟踪 下面是代码的样子 const webdriver = require('selenium-webdriver') const chrome = require("selenium-web

我是Selenium的新手,我想我只是不了解代码和浏览器中发生了什么。我可以通过将driver.wait代码(张贴在下面)替换为
driver.sleep(1000)
来解决我的问题,但我一直在读到sleep语句并不理想

有人能帮我弄清楚为什么我的代码不起作用,到底是怎么回事吗?如果有帮助,我可以提供完整的堆栈跟踪

下面是代码的样子

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”]”

driver.wait(直到.element可见(driver.findElement(By.id('Passwd')),5000))

实际上,等待元素出现时才使用此语句是不正确的,在该语句中,
driver.findelelement(By.id('Passwd'))
将抛出
NoSuchElementError
,如果此时元素不在您所获得的
DOM

您应该先尝试使用等待,直到所需元素出现在
DOM
上,然后使用以下命令等待,直到元素可见:-


.isEnabled()
通常仅适用于禁用/启用的
按钮
标记。您可以尝试等待它可见或可点击。哦。。。还有一条评论。你想让函数只做一件事。。。在这种情况下,我会将
googeLogin()
更改为
login()
,然后取出设置驱动程序的部分并导航到google。让它只处理登录部分。@JeffC我稍微整理了一下代码。我删除了
isEnabled()
函数,但仍看到
元素不可见的错误。是否尝试等待元素可见?e、 g.
位于的元素的可见性
。请参阅我在文档中看到一个
元素可见
,但在尝试使用它时出现错误。到目前为止,我只能让
elementLocated
工作。
const until = webdriver.until;

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