【问题标题】:ElementNotVisibleException: Message: element not visible - Python3 SeleniumElementNotVisibleException:消息:元素不可见 - Python3 Selenium
【发布时间】:2018-03-25 14:06:31
【问题描述】:

我的任务是编写一个解析器来单击网站上的一个类似于按钮的 href 链接,但我遇到了一些问题。

这是 html:https://pastebin.com/HDKLXpdJ

这里是源代码:https://pastebin.com/PgT91kJs

Python 代码:

browser = webdriver.Chrome()
...
try:

    element = WebDriverWait(browser, 20).until(
        EC.presence_of_element_located((By.ID, "reply-panel-reveal-btn")))

finally:
      elem = browser.find_element_by_xpath("//A[@id='reply-panel-reveal-btn']").click()

我收到此错误。

selenium.common.exceptions.ElementNotVisibleException: Message: element not visible

我尝试在 ChromeDriver 和 GeckoDriver(FF) 之间切换,但我一遍又一遍地遇到同样的错误。我什至尝试等待 10 秒加载,结果相同。

完整的错误文本:

File "C:/Users/DEM/PycharmProjects/Test/Scrape.py", line 46, in <module> elem = browser.find_element_by_xpath("//A[@id='reply-panel-reveal-btn']").click()
File "C:\Users\DEM\AppData\Local\Programs\Python\Python36-32\lib\site-packages\selenium\webdriver\remote\webelement.py", line 77, in click self._execute(Command.CLICK_ELEMENT)
File "C:\Users\DEM\AppData\Local\Programs\Python\Python36-32\lib\site-packages\selenium\webdriver\remote\webelement.py", line 493, in _execute return self._parent.execute(command, params)
File "C:\Users\DEM\AppData\Local\Programs\Python\Python36-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 256, in execute self.error_handler.check_response(response)
File "C:\Users\DEM\AppData\Local\Programs\Python\Python36-32\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 194, in check_response raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.ElementNotVisibleException: Message: element not visible
(Session info: chrome=61.0.3163.100)
(Driver info: chromedriver=2.33.506120 (e3e53437346286c0bc2d2dc9aa4915ba81d9023f),platform=Windows NT 6.1.7601 SP1 x86_64)

关于它应该如何工作的视频链接:

https://streamable.com/e1uvm

编辑:

问题已解决,请查看 @JeffC 答案。

正确的代码:

browser = webdriver.Chrome()
...
element = WebDriverWait(driver, 20).until(
EC.element_to_be_clickable((By.XPATH, "(//a[@id='reply-panel-reveal-btn'])[2]")));
element.click()

问题:

我在等待元素的出现。存在并不意味着元素可见或可点击,它只是意味着元素在 DOM 中。另外,我在等待第一个元素,它恰好是不可见的。我需要找到第二个元素并等待它被点击。

【问题讨论】:

  • 是否需要向下滚动才能查看按钮?
  • 有时,如果您不滚动,则不会生成动态内容。您可以在 JavaScript 中模拟这种行为
  • @Stack 你不需要向下滚动。
  • @rak007 你怎么能这样?
  • @rak007 谢谢你的好建议。这在某些情况下可能很有用,但在这种情况下,它不起作用。

标签: python selenium scrape


【解决方案1】:

有几个问题。

  1. 您正在等待元素的存在。存在只是意味着元素在 DOM 中,而不是可见或可点击。如果您要等待并单击一个元素,请等待它可单击。如果您要等待send_keys() 或从元素中获取文本,请等待它可见。这些是存在的一些用途,但我不经常使用它。话虽如此……

  2. 有两个元素与您的定位器匹配,id=reply-panel-reveal-btn。第一个匹配的恰好是不可见的。使用 XPath,我们可以创建一个定位器来查找第二个元素,等待它可点击,然后点击它。

    element = WebDriverWait(driver, 20).until(
        EC.element_to_be_clickable((By.XPATH, "(//a[@id='reply-panel-reveal-btn'])[2]")));
    element.click()
    

【讨论】:

  • 基本上,我需要做的只是等待第二个元素可以点击,然后点击第二个不可见的元素,对吧?谢谢@JeffC!现在我终于可以完成我的项目了。我不是在开玩笑,你只是让我开心。
  • 我一直使用的一件事是 Chrome 的开发工具来定位页面上的元素。这是验证您的定位器是否正常工作以及您是否正在找到您期望的元素的快速方法。 $$() 用于 CSS 选择器,例如$$("span.someClass")$x() 用于 XPath,例如$x("//a[@id='someId']")。更多信息here
  • 如果你在页面上运行$$("#reply-panel-reveal-btn"),你会看到它返回了两个元素。如果您展开返回并悬停每一个,您将看到第二个是页面上可见的那个。这是一个巨大的节省时间,我一直使用它。
  • 你是对的。通过在开发工具控制台中输入 $$("#reply-panel-reveal-btn") ,它返回了两个元素。这在处理像这样的问题时非常有用,使整个情况更加清晰。再次感谢您帮助我!
【解决方案2】:

你能不能点击一下

//span[@class='icn-phone icn-quaternary']

//div[@class='clearfix']

【讨论】:

  • 感谢您的建议。我尝试了两种路径,但仍然遇到相同的错误。
  • 使用显式等待可见性怎么样?
  • @Guarang Shah 现在会尝试一下
  • @Guarag Shah 尝试 time.sleep(20) 睡眠 20 秒,没有成功。
猜你喜欢
  • 2019-04-19
  • 2016-03-31
  • 2018-08-17
  • 1970-01-01
  • 2019-05-04
  • 1970-01-01
  • 2021-03-09
  • 2018-09-17
相关资源
最近更新 更多