代码之家  ›  专栏  ›  技术社区  ›  lonerunner

Python、Selenium找到具有类的元素并等待类更改

  •  1
  • lonerunner  · 技术社区  · 6 年前

    我所能想到的是找到具有特定类的元素,并等待它发生变化,一旦它发生变化,就意味着内容加载到dom中。

    Selenium 具有 Firefox webdriver 在…上 Ubuntu

    以下是我希望监控的班级:

    <div class="wheel spinning"></div>
    

    <div class="wheel"></div>
    

    任何人都可以找到解决方案来查找和监视 class="wheel spinning" class="wheel" 继续抓取数据。

    try:
        element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.XPATH, "//*[@class='wheel']))
    )
    title = driver.find_element_by_xpath('/html/body/div[1]/div[1]/div[3]')
    print(title.text)
    

    但若元素在10秒内并没有出现,那个么错误就出来了,现在我们要想办法一次又一次地重试,直到元素出现在页面上。

    使用上有区别吗 presence_of_element_located((By.XPATH)) find_element_by_xpath

    2 回复  |  直到 6 年前
        1
  •  5
  •   undetected Selenium    5 年前

    @卢卡斯蒂尼的回答是正确的。但是,我仍然觉得解决方案可以优化如下:

    作为 是可见的,而不是 presence_of_element_located() visibility_of_element_located()

    节点:

    <div class="wheel spinning"></div>
    

    XPath 仅包含一个类,即 wheel 例如:

    el = WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.XPATH, "//*[@class='wheel']")))
    

    相反,您可以使用 Locator Strategies :

    • cssSelector

      el = WebDriverWait(driver, 30).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.wheel.spinning")))
      WebDriverWait(driver, 10).until(lambda d: 'spinning' not in el.get_attribute('class'))
      
    • xpath :

      el = WebDriverWait(driver, 30).until(EC.visibility_of_element_located((By.XPATH, "//div[@class='wheel spinning']")))
      WebDriverWait(driver, 10).until(lambda d: 'spinning' not in el.get_attribute('class'))
      
        2
  •  6
  •   Lucas Tierney    6 年前

    from selenium.webdriver.support.ui import WebDriverWait
    
    # Wait longer than 10 seconds since you're getting occasional timeout
    el = WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.XPATH, "//*[@class='wheel']")))
    
    
    wait = WebDriverWait(driver, 10)
    wait.until(lambda d: 'spinning' not in el.get_attribute('class'))
    

    这个 until passes the driver to the method given ,这样您就可以很容易地创建自己的预期条件。上面使用的是匿名lambda函数,但也可以使用闭包或接受参数的任何可调用对象(ExpectedConditions库只是一组可调用类)。以下是一个闭包:

    from selenium.webdriver.support.ui import WebDriverWait
    
    
    # Wait longer than 10 seconds since you're getting occasional timeout
    el = WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.XPATH, "//*[@class='wheel']")))
    
    def wait_not_spinning(driver):
        return 'spinning' not in el.get_attribute('class')
    
    wait = WebDriverWait(driver, 10)
    wait.until(wait_not_spinning)