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

时间:2015-03-12 08:09:24

标签: python selenium selenium-webdriver

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

今天,我遇到了一个问题,即HTML中存在警报消息的xpath但实际上在网站上不可见。一个例子是JS将在用户进入页面时显示横幅消息,但在3秒后消失。

CSS Selector span.greet将始终以HTML格式返回元素,但并不一定意味着它正在页面上显示。

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

我阅读了关于is_Visible()的文档但是我不太确定我是否完全理解它是否可以成为解决方案?如果没有,我可以使用其他方法吗?

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

通过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方法。

http://selenium-python.readthedocs.org/en/latest/waits.html?highlight=wait

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

http://selenium-python.readthedocs.org/en/latest/api.html?highlight=is_displayed#selenium.webdriver.remote.webelement.WebElement.is_displayed

答案 2 :(得分:0)

visibility_of_element_located 预期条件需要explicitly wait。或者,换句话说,等待元素变为可见:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 10)
element = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "span.greet")))

拒绝使用time.sleep()的诱惑 - 这是非常不可靠和错误提示。