首页 > 解决方案 > 如何获取刷新 div 的数据(Selenium)

问题描述

我正在尝试废弃一个内容(div)每 2 秒刷新一次的网站。

除了我不断获得之外,我当前的代码工作正常StaleElementReferenceException因为元素不断刷新所有内容 2 秒。

以下是我到目前为止所拥有的

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options


import time, sys

option = webdriver.ChromeOptions()
browser = webdriver.Chrome(executable_path='chromedriver', chrome_options=option)
browser.get("example.com")

sports_categories = browser.find_elements_by_css_selector('div.sidebar-wrapper')

for sport in sports_categories:
   if sport.text == 'FOOTBALL':
        sport.click()
        time.sleep(2)

        sub_menus_html = browser.find_element_by_css_selector('div.category.lvl1.open  div.dropdown')

        print(sub_menus_html)

我的问题是,

任何帮助或建议将不胜感激。

标签: python-3.xseleniumselenium-chromedriver

解决方案


由于您click()正在刷新元素,因此您必须收集DOM中的当前元素,因为您在开始循环之前收集的元素列表已变为STALE

下面是一个示例,说明如何循环并不断更新正在循环的元素的列表对象:

option = webdriver.ChromeOptions()
browser = webdriver.Chrome(executable_path='chromedriver', chrome_options=option)
browser.get("example.com")

sports_categories = browser.find_elements_by_css_selector('div.sidebar-wrapper')

# add counter to keep track
counter = 0
for sport in sports_categories:
    #add category refresh here
    current_categories= browser.find_elements_by_css_selector('div.sidebar-wrapper')
    if current_categories[counter].text == 'FOOTBALL':    
        current_categories[counter].click()
        # I would recommend using something other than sleep to wait for load
        # like webdriverwait conditions combined with Expected Conditions
        time.sleep(2)
        sub_menus_html = browser.find_element_by_css_selector('div.category.lvl1.open  div.dropdown')
        print(sub_menus_html)
    counter += 1

由于我无法访问您正在处理的网站,因此我不确定这个确切的代码块是否可以按原样工作。

如果项目的长度div.sidebar-wrapper发生变化,或者侧边栏中的项目顺序发生变化,您可能会遇到问题。

但是,刷新您正在循环的元素列表背后的逻辑仍然适用。


推荐阅读