ElementNotVisibleException:消息:元素不可见-Python3

ElementNotVisibleException:消息:元素不可见-Python3,python,selenium,scrape,Python,Selenium,Scrape,我的任务是编写一个解析器,在一个网站上单击一个href链接,看起来像一个按钮,我遇到了一些问题 以下是html:https://pastebin.com/HDKLXpdJ 以下是源html:https://pastebin.com/PgT91kJs Python代码: 我得到了这个错误 selenium.common.exceptions.ElementNotVisibleException: Message: element not visible 我曾尝试在ChromeDriver和Gec

我的任务是编写一个解析器,在一个网站上单击一个href链接,看起来像一个按钮,我遇到了一些问题

以下是html:https://pastebin.com/HDKLXpdJ

以下是源html:https://pastebin.com/PgT91kJs

Python代码:

我得到了这个错误

selenium.common.exceptions.ElementNotVisibleException: Message: element not visible
我曾尝试在ChromeDriver和GeckoDriverFF之间切换,但我一次又一次地遇到同样的错误。我甚至试着等待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)
问题是:


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

你能试着点击一下吗

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


有几个问题

您正在等待元素的存在。存在只是意味着元素在DOM中,而不是它是可见的或可单击的。如果要等待并单击某个元素,请等待该元素可单击。如果要等待发送_键或从元素中获取文本,请等待其可见。这个词有一些存在的用途,但我不经常使用。话虽如此

有两个元素与您的定位器匹配,id=回复面板显示btn。第一个匹配的恰好是看不见的。使用XPath,我们可以创建一个定位器来查找第二个元素,等待它可单击,然后单击它

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

需要向下滚动查看按钮吗?有时,如果不滚动,则不会生成动态内容。您可以在中模拟此行为JavaScript@Stack你不需要向下滚动。@rak007你怎么能这样做?@rak007谢谢你的建议。这在某些情况下可能有用,但在这种情况下,它不起作用。谢谢你的建议。我尝试了两种路径,但仍然得到相同的错误。使用显式等待可见性如何?@Guarang Shah会尝试的now@GuaragShah试着计时。sleep20睡眠20秒,不起作用。基本上,我所需要做的就是等待第二个元素可以点击,然后点击第二个不可见的元素,对吗?谢谢@JeffC!现在我终于可以完成我的项目了。我不是开玩笑,你让我很开心。我一直在用Chrome的开发工具来定位页面上的元素。这是一种验证定位器是否正常工作以及您是否正在查找所需元素的快速方法。$$用于CSS选择器,例如$$span.someClass$x代表XPath,例如$x//a[@id='someId']。更多信息如果在页面上运行$$reply panel discover btn,您将看到它返回2个元素。如果展开return并将其悬停,您将看到第二个是页面上可见的。这是一个巨大的节省时间,我一直在使用它。你说得对。通过在开发工具控制台中键入$$reply panel reveal btn,它返回了两个元素。在处理像这样的问题时,这将非常有用,使整个情况更加清楚。再次感谢你帮助我!
//span[@class='icn-phone icn-quaternary']
//div[@class='clearfix']
element = WebDriverWait(driver, 20).until(
    EC.element_to_be_clickable((By.XPATH, "(//a[@id='reply-panel-reveal-btn'])[2]")));
element.click()