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

Ale*_*lex 7 python selenium

我无法理解如何使用“预期条件”来检查元素是否存在。鉴于此文档,根本不清楚如何使用它。我试过下面的代码

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

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

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

    <selenium.webdriver.support.expected_conditions.visibility_of_element_located object at 0x110321b90>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果没有 ,此功能如何工作webdriver?通常你总是有这样的电话

    driver.do_something()
    
    Run Code Online (Sandbox Code Playgroud)

但是对于“预期条件”,webdriver 的参考在哪里?

Deb*_*anB 7

看来你快到了。

里面Documentation明确说了以下几点:

class selenium.webdriver.support.expected_conditions.visibility_of_element_located(locator)
Run Code Online (Sandbox Code Playgroud)

其定义为:

期望检查元素是否存在于页面的 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"]'))
Run Code Online (Sandbox Code Playgroud)

发现的WebElement返回如下:

<selenium.webdriver.support.expected_conditions.visibility_of_element_located object at 0x110321b90>
Run Code Online (Sandbox Code Playgroud)

甚至Source Code说的是一样的:

try:
    return _element_if_visible(_find_element(driver, self.locator))
Run Code Online (Sandbox Code Playgroud)

当搜索不成功时:

except StaleElementReferenceException:
    return False
Run Code Online (Sandbox Code Playgroud)

  • `&lt;selenium.webdriver.support.expected_conditions.visibility_of_element_ located 对象位于 0x110321b90&gt;` 不是 WebElement,而只是 `visibility_of_element_ located()` 类的实例。要获取 WebElement,应将其调用为 `EC.visibility_of_element_ located((By.XPATH, '//*[@id="kernel_indicator_icon" and @title="Kernel Idle"]'))(driver)` (2认同)

ale*_*cxe 6

以更有条理的方式总结:

  • 预期条件是可调用的(可以是定义了__call__()魔术方法的函数或类)
  • 预期条件应该在实例until()方法中使用:WebDriverWait()

    wait = WebDriverWait(driver, 10)
    wait.until(<Expected_condition_here>)
    
    Run Code Online (Sandbox Code Playgroud)
  • 预期条件的结果不一定是True/ False。结果将由WebDriverWait. 注意:WebElement实例是“真实的”。在此处阅读有关 Python 真实性的更多信息

  • 当预期条件返回一个WebElement实例时,这是非常方便的。它允许立即链接到一个元素,而无需再次找到它:

    button = wait.until(EC.element_to_be_clickable((By.ID, "my_id")))
    button.click()
    
    Run Code Online (Sandbox Code Playgroud)
  • 您可以编写自己的自定义预期条件