使用selenium和python,如何检查元素是否存在,但实际上不可见

使用selenium和python,如何检查元素是否存在,但实际上不可见,python,selenium,selenium-webdriver,Python,Selenium,Selenium Webdriver,我一直在使用find_element_by_xpath或cssSelector来定位页面上的元素 今天,我遇到了一个问题,警告消息的xpath出现在HTML中,但实际上在站点上不可见。例如,当用户进入页面时,JS将显示一条横幅消息,但在3s后消失 CSS选择器span.greet将始终返回HTML中的元素,但这并不意味着它显示在页面上 ... <span class="greet">Hello</span> <span class="greetAgain">H

我一直在使用find_element_by_xpath或cssSelector来定位页面上的元素

今天,我遇到了一个问题,警告消息的xpath出现在HTML中,但实际上在站点上不可见。例如,当用户进入页面时,JS将显示一条横幅消息,但在3s后消失


CSS选择器
span.greet
将始终返回HTML中的元素,但这并不意味着它显示在页面上

...
<span class="greet">Hello</span>
<span class="greetAgain">Hello Again!</span>
...
。。。
你好
你好!
...

我阅读了关于is_Visible()的文档,但我不太确定我是否完全理解这是否是一个解决方案?如果没有,还有其他方法可以替代吗?

通过selenium加载页面后,该元素在测试时可能可见,但在一段时间后隐藏

一个简单的方法是等待一段固定的时间

如果要等待元素隐藏,可以使用
time.sleep
暂停脚本

import time

def your_test_function():
    # initial tests (to check if elements are displayed)
    time.sleep(3)
    # delayed tests (to check if something is hidden)
如果您需要更多的控制,或者希望等待显示/隐藏元素,可以使用Webdriver的
wait
方法

此外,您应该使用
is_display
方法检查元素是否可见

您需要了解所处元素的可见性是否符合预期条件。或者,换句话说,等待元素变为可见:


抵制使用
time.sleep()
-这是非常不可靠的错误提示。

我也有类似的问题,但在我的情况下,另一个元素覆盖了实际元素。因此,我找到了一个使用javascript executer而不是使用webdriver单击的解决方案。等待一段时间可能会导致测试期间出现随机错误。 单击“确定”按钮示例:

ok_btn = self.driver.find_element_by_xpath("//button[contains(.,'OK')]")
self.driver.execute_script("arguments[0].click();",  ok_btn)

“但这并不意味着它会显示在页面上。”-好吧,即使你试图等待可见性,它也永远无法与之交互,除非它真的在屏幕上可见。你必须使用
移动\U到\U元素
,并可能单击它们以使其可用于交互。一个快速的解决方法是使窗口高度与从javascript返回中收集的文档视口高度相同。
ok_btn = self.driver.find_element_by_xpath("//button[contains(.,'OK')]")
self.driver.execute_script("arguments[0].click();",  ok_btn)