【问题标题】:Selenium: Element is not currently visible and so may not be interactedSelenium:元素当前不可见,因此可能无法交互
【发布时间】:2017-01-27 16:08:47
【问题描述】:

我正在尝试为 netflix 网站创建一个自动登录脚本:https://www.netflix.com/it/

代码如下:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Firefox()
while True:
    driver.get("https://www.netflix.com/it/")
    login = driver.find_element_by_css_selector(".authLinks.signupBasicHeader")
    login.click()
    element = driver.find_element_by_name("email")
    element.send_keys("test1@email.com")
    submit = driver.find_element_by_css_selector(".btn.login-button.btn-submit.btn-small")
    submit.click()
    element2 = driver.find_element_by_name("password")
    element2.send_keys("test1")
    submit.click()

但有时有效,有时无效,并引发此异常:

Traceback (most recent call last):
  File "netflix.py", line 35, in <module>
    submit.click()
  File "/home/user/.local/lib/python3.5/site-packages/selenium/webdriver/remote/webelement.py", line 72, in click
    self._execute(Command.CLICK_ELEMENT)
  File "/home/user/.local/lib/python3.5/site-packages/selenium/webdriver/remote/webelement.py", line 461, in _execute
    return self._parent.execute(command, params)
  File "/home/user/.local/lib/python3.5/site-packages/selenium/webdriver/remote/webdriver.py", line 236, in execute
    self.error_handler.check_response(response)
  File "/home/user/.local/lib/python3.5/site-packages/selenium/webdriver/remote/errorhandler.py", line 192, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.ElementNotVisibleException: Message: Element is not currently visible and so may not be interacted with
Stacktrace:
    at fxdriver.preconditions.visible (file:///tmp/tmp7otgskq8/extensions/fxdriver@googlecode.com/components/command-processor.js:10092)
    at DelayedCommand.prototype.checkPreconditions_ (file:///tmp/tmp7otgskq8/extensions/fxdriver@googlecode.com/components/command-processor.js:12644)
    at DelayedCommand.prototype.executeInternal_/h (file:///tmp/tmp7otgskq8/extensions/fxdriver@googlecode.com/components/command-processor.js:12661)
    at DelayedCommand.prototype.executeInternal_ (file:///tmp/tmp7otgskq8/extensions/fxdriver@googlecode.com/components/command-processor.js:12666)
    at DelayedCommand.prototype.execute/< (file:///tmp/tmp7otgskq8/extensions/fxdriver@googlecode.com/components/command-processor.js:12608)

该异常表示网页的一部分是不可见的(即使该部分实际上在页面中)...这是一种错误。 我怎样才能绕过这个?

【问题讨论】:

  • 在打开网址后添加wait,给驱动程序一些时间来显示元素。
  • 我添加了一个 time.sleep 但它不起作用...

标签: python python-3.x selenium


【解决方案1】:

不需要将测试代码放在while循环中,因为登录表单应该提交一次。我猜当它成功运行时,下一次迭代会出错,因为没有表单。

您还在输入密码之前和之后单击提交按钮。如果可能,最好在表格填满后单击,而不是测试空表格。

from selenium import webdriver

driver = webdriver.Firefox()
driver.get("https://www.netflix.com/it/")
login = driver.find_element_by_css_selector(".authLinks.signupBasicHeader")
login.click()
element = driver.find_element_by_name("email")
element.send_keys("test1@email.com")
submit = driver.find_element_by_css_selector(".btn.login-button.btn-submit.btn-small")
submit.click()
element2 = driver.find_element_by_name("password")
element2.send_keys("test1")
submit = driver.find_element_by_css_selector(".btn.login-button.btn-submit.btn-small")
submit.click()

【讨论】:

  • 感谢您的回答。我需要 while True 因为在真实和完整的脚本中(我只发布了存在异常的提交部分)我尝试使用多个帐户登录。所以我需要while循环。关于提交,我写了2次导致netflix登录页面有时会在同一页面打开一个带有电子邮件和密码的表单,有时它会显示:首先是电子邮件表单,并且有一个提交按钮,用于输入密码,然后提交所有表单(电子邮件和密码),例如:imgur.com/a/4lGf6
  • 如果你想用不同的用户进行测试,你应该编写一个登录函数并在一个案例中用不同的数据调用它。
  • @AllExJ 你可以从礼貌开始。
  • 我没有礼貌吗?如果是,对不起,我不是英语。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-08
  • 2016-04-30
  • 2014-11-13
  • 2016-11-13
相关资源
最近更新 更多