如何使用预期条件'检查python-selenium中的元素?

时间:2017-12-13 09:52:03

标签: python selenium

我无法理解如何使用预期条件'检查是否存在元素。鉴于this documentation,根本不清楚如何使用它。我试过以下代码

 def _kernel_is_idle(self):
    return EC.visibility_of_element_located((By.XPATH, '//*[@id="kernel_indicator_icon" and @title="Kernel Idle"]'))

用于检查元素(可调用为类中的方法)的想法。有两件事没有任何意义:

  1. 根据文档(我必须查找源代码!),此方法应返回TrueFalse。但是,它返回以下内容:

    <selenium.webdriver.support.expected_conditions.visibility_of_element_located object at 0x110321b90>
    
  2. 如果没有webdriver,此功能如何运作?通常你总是有一个像

    这样的电话
    driver.do_something()
    
  3. 但是对于预期条件&#39;在哪里引用webdriver?

5 个答案:

答案 0 :(得分:3)

以更有条理的方式总结:

  • 预期条件是可调用的(可以是定义了__call__() magic method的函数或类)
  • 预期条件应该在WebDriverWait() instanceuntil()方法中使用:

    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()
    
  • 您可以自己编写custom Expected Conditions

答案 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"]')))

修改 我应该注意,这不会返回TrueFalse。如果已找到并且可见,则会返回WebElement。否则会引发TimeOutExceptionSource

答案 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()