Selenium循环点击商品返回后报stale element reference错误如何解决
问题根源
你首次加载列表页时获取的products元素列表,绑定的是当时页面的DOM节点。调用driver.back()返回列表页后,浏览器重新渲染了页面,原有DOM节点全部销毁,之前保存的元素引用全部失效,所以第二次循环读取product.text时直接触发StaleElementReferenceException,这个问题和页面加载速度无关,加time.sleep无法解决。
方案1:按索引遍历,每次循环重新获取元素
保留你原有的「点击进入-返回」操作逻辑,调整遍历方式即可:
Path = "C:\\Program Files (x86)\\chromedriver.exe" driver = webdriver.Chrome(Path) driver.get("https://www.emag.ro/") search_bar = driver.find_element_by_id("searchboxTrigger") search_bar.send_keys("laptopuri") search_bar.send_keys(Keys.RETURN) main = None try: main = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "main-container")) ) print("Page loaded,main retrived succesfully\n") except: driver.quit() # 先获取商品总数量 products = main.find_elements_by_css_selector("div.card-item.js-product-data") product_count = len(products) # 按索引遍历,每次循环都重新获取元素 for i in range(product_count): # 每次循环先重新定位main容器和商品列表 main = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "main-container")) ) products = main.find_elements_by_css_selector("div.card-item.js-product-data") product = products[i] raw_name = product.text raw_price = product.find_element_by_css_selector("p.product-new-price").text link = product.find_element_by_tag_name("a") link.click() spec_page = None try: spec_page = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, "col-md-12")) ) except: driver.quit() print(spec_page) driver.back()
方案2:提前收集所有商品信息,逐个访问(更稳定)
不需要来回切换页面,避免重复获取元素的开销,稳定性更高:
Path = "C:\\Program Files (x86)\\chromedriver.exe" driver = webdriver.Chrome(Path) driver.get("https://www.emag.ro/") search_bar = driver.find_element_by_id("searchboxTrigger") search_bar.send_keys("laptopuri") search_bar.send_keys(Keys.RETURN) main = None try: main = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "main-container")) ) print("Page loaded,main retrived succesfully\n") except: driver.quit() products = main.find_elements_by_css_selector("div.card-item.js-product-data") # 提前把所有商品的信息存到列表里 product_info_list = [] for product in products: raw_name = product.text raw_price = product.find_element_by_css_selector("p.product-new-price").text link = product.find_element_by_tag_name("a").get_attribute("href") product_info_list.append({ "name": raw_name, "price": raw_price, "link": link }) # 遍历存储好的信息直接访问详情页 for info in product_info_list: driver.get(info["link"]) spec_page = None try: spec_page = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, "col-md-12")) ) except: driver.quit() print(spec_page)
内容的提问来源于stack exchange,提问作者Dragos Ciupe
相关产品推荐
相关产品推荐

