【问题标题】:Selenium - wait until element is present, visible and interactableSelenium - 等到元素出现、可见且可交互
【发布时间】:2020-03-26 13:13:48
【问题描述】:

我有一个 Selenium 脚本 (Python),它单击回复按钮以使类 anonemail 出现。类 anonemail 出现所需的时间各不相同。因此,我必须使用 sleep 直到元素出现。

我想等到课程出现而不是使用睡眠。我听说过等待命令,但我不知道如何使用它们。

这是我目前所拥有的:

browser.find_element_by_css_selector(".reply-button").click()
sleep(5)
email=browser.find_element_by_css_selector(".anonemail").get_attribute("value")

【问题讨论】:

  • 是否有任何答案解决了等待元素可交互的问题?它可以存在且可点击,但您仍无法向其发送密钥。

标签: python selenium selenium-webdriver webdriverwait expected-condition


【解决方案1】:

根据最佳实践:

  • 如果您的用例是验证任何元素的存在,您需要诱导WebDriverWaitexpected_conditions 设置为presence_of_element_located(),这是检查元素是否存在于页面的 DOM。这并不一定意味着该元素是可见的。所以有效的代码行将是:

    WebDriverWait(browser, 20).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".reply-button"))).click()
    
  • 如果您的用例是提取任何元素的任何属性,您需要诱导WebDriverWaitexpected_conditions 设置为visibility_of_element_located(locator),这是检查元素是否存在于页面的 DOM 并且可见。可见性意味着元素不仅被显示,而且具有大于 0 的高度和宽度。因此,在您的用例中,代码行将是:

    email = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "element_css"))).get_attribute("value")
    
  • 如果您的用例是在任何元素上调用 click(),则您需要诱导 WebDriverWaitexpected_conditions 设置为 element_to_be_clickable(),这是检查元素是否可见的期望,并且启用,以便您可以单击它。因此,在您的用例中,代码行将是:

    WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".reply-button"))).click()
    

参考文献

您可以在以下位置找到一些详细的讨论:

【讨论】:

    【解决方案2】:

    点击回复按钮后,使用.visibility_of_element_located如下:

    browser.find_element_by_css_selector(".reply-button").click()
    
    # Wait for initialize, in seconds
    wait = WebDriverWait(browser, 10)
    
    email = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, '.anonemail'))).get_attribute("value")
    print(email)
    

    导入后:

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

    Waits documentation

    【讨论】:

      【解决方案3】:

      您可以使用等待。在 Selenium waits 中查看更多信息。

      在下面的示例中,我们使用函数 visibility_of_element_located 等待 10 秒以使元素可见。

      driver = webdriver.Firefox()
      driver.get("http://somedomain/url_that_delays_loading")
      try:
          element = WebDriverWait(driver, 10).until(
              EC.visibility_of_element_located((By.ID, "myDynamicElement"))
          )
      finally:
          driver.quit()
      

      【讨论】:

        【解决方案4】:

        你可以使用implicitly_wait:

        from selenium import webdriver
        
        driver = webdriver.Firefox()
        driver.implicitly_wait(15)
        driver.get("http://url")
        driver.find_element_by_id("id_of_element").click()
        

        它一直等到元素被加载。

        在您的情况下,实施将是,

        browser.implicitly_wait(10)
        browser.find_element_by_css_selector(".reply-button").click()
        email = browser.find_element_by_css_selector(".anonemail").get_attribute("value")
        

        【讨论】:

          【解决方案5】:

          这对我来说很有效:

          from selenium import webdriver, common
          
          browser = webdriver.Chrome()
          browser.get("www.yourwebpage.com")
          
          while True:
              try:
                  email = browser.find_element_by_css_selector(".anonemail").get_attribute("value")
                  break
              except common.exceptions.NoSuchElementException:
                  print("Fail.")
          
          print(email)
          

          【讨论】:

            猜你喜欢
            • 2021-02-23
            • 2021-09-05
            • 2014-05-03
            • 2022-01-22
            • 2021-07-01
            • 2021-08-02
            • 1970-01-01
            • 2017-10-03
            相关资源
            最近更新 更多