我无法理解如何使用预期条件'检查是否存在元素。鉴于this documentation,根本不清楚如何使用它。我试过以下代码
def _kernel_is_idle(self):
return EC.visibility_of_element_located((By.XPATH, '//*[@id="kernel_indicator_icon" and @title="Kernel Idle"]'))
用于检查元素(可调用为类中的方法)的想法。有两件事没有任何意义:
根据文档(我必须查找源代码!),此方法应返回True
或False
。但是,它返回以下内容:
<selenium.webdriver.support.expected_conditions.visibility_of_element_located object at 0x110321b90>
如果没有webdriver
,此功能如何运作?通常你总是有一个像
driver.do_something()
但是对于预期条件&#39;在哪里引用webdriver?
答案 0 :(得分:3)
以更有条理的方式总结:
__call__()
magic method的函数或类)预期条件应该在WebDriverWait()
instance的until()
方法中使用:
wait = WebDriverWait(driver, 10)
wait.until(<Expected_condition_here>)
预期条件的结果不一定只是True
/ False
。结果将由WebDriverWait
在真实性上进行测试。注意:WebElement
实例是“真实的”。阅读有关Python here
当预期条件返回WebElement
实例时非常方便。它允许立即获得一个元素的链接,而无需再次找到它:
button = wait.until(EC.element_to_be_clickable((By.ID, "my_id")))
button.click()
答案 1 :(得分:1)
expected conditions
的工作方式是定义WebDriverWait
。您可以使用WebDriver
的实例和超时来创建它。 WebDriverWait
有一个until()
方法,它将占用expected condition
并等到它已满足或超时已超过。因此,您应该使用:{/ p>而不仅仅是EC.visibility_of_element_located((By.XPATH, '//*[@id="kernel_indicator_icon" and @title="Kernel Idle"]'))
WebDriverWait(yourdriver, timeout).until(EC.visibility_of_element_located((By.XPATH, '//*[@id="kernel_indicator_icon" and @title="Kernel Idle"]')))
修改强>
我应该注意,这不会返回True
或False
。如果已找到并且可见,则会返回WebElement
。否则会引发TimeOutException
。 Source
答案 2 :(得分:1)
好像你差点就到了。
Documentation
清楚地说明了以下内容:
class selenium.webdriver.support.expected_conditions.visibility_of_element_located(locator)
定义为:
期望检查页面的DOM上是否存在元素并且可见。可见性意味着元素不仅会显示,而且高度和宽度也大于0. locator - 用于查找元素
returns the WebElement once it is located and visible
因此,当你提到:
return EC.visibility_of_element_located((By.XPATH, '//*[@id="kernel_indicator_icon" and @title="Kernel Idle"]'))
找到的WebElement
返回如下:
<selenium.webdriver.support.expected_conditions.visibility_of_element_located object at 0x110321b90>
即使Source Code
也与:
try:
return _element_if_visible(_find_element(driver, self.locator))
搜索失败时:
except StaleElementReferenceException:
return False
答案 3 :(得分:0)
您几乎成功了!您想要的是:
def _kernel_is_idle(self):
return EC.visibility_of_element_located(
(By.XPATH, '//*[@id="kernel_indicator_icon" and @title="Kernel Idle"]')
)(driver)
在这里,您应该将webdriver对象作为参数传递。
答案 4 :(得分:0)
首先,您需要从selenium.webdriver.support导入Expected_conditions模块。 通过该模块,您还可以检查元素的几种情况,并给出预期的时间
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("http://domain/element")
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "idxxx"))
)
finally:
driver.quit()