【问题标题】:WebdriverJS ElementNotVisibleError: element not visibleWebdriverJS ElementNotVisibleError:元素不可见
【发布时间】:2016-10-14 12:59:41
【问题描述】:

我是 Selenium 的新手,我想我只是不明白代码和浏览器中发生了什么。我可以通过用driver.sleep(1000) 替换 driver.wait 代码(在下面发布)来解决我的问题,但我一直在阅读 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:没有这样的元素:无法定位元素:{"method":"css selector","selector":"*[id="Passwd"]"}

【问题讨论】:

  • .isEnabled() 通常只适用于BUTTON 标签被禁用/启用。您可以尝试等待它可见或可点击。
  • 哦...还有另一条评论。你想让函数只做一件事情......在这种情况下,我会将googeLogin() 更改为login() 并取出设置驱动程序并导航到谷歌的部分。让它只处理登录部分。
  • @JeffC 我稍微清理了代码。我删除了 isEnabled() 函数,但仍然看到 element not visible 错误。
  • 您是否尝试过等到元素可见?例如visibility_of_element_located。见selenium-python.readthedocs.io/waits.html
  • 我在文档seleniumhq.github.io/selenium/docs/api/javascript/module/… 中看到了一个elementIsVisible,但是当我尝试使用它时出现错误。到目前为止,我只能让elementLocated 工作。

标签: node.js selenium selenium-webdriver


【解决方案1】:

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)

【讨论】:

    猜你喜欢
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多