Python Selenium获取localStorage多键值对返回空对象问题求助
问题:Selenium获取多条目localStorage返回空对象的排查与解决
我尝试使用Python结合Selenium获取localStorage中的键值对数据。当前代码在localStorage仅有单个条目时可正常运行,但存在多个条目时会返回空对象{},恳请帮忙排查问题。
原代码如下:
from webbrowser import Chrome from selenium import webdriver class LocalStorage: def __init__(self, driver: webdriver) : self.driver = driver def goto(self): self.driver.get("https://tribune.com.pk") return self def __len__(self): return self.driver.execute_script("return window.localStorage.length;") def items(self) : return self.driver.execute_script( \ "var ls = window.localStorage, items = {}; " \ "for (var i = 0, k; i < ls.length; ++i) " \ " items[k = ls.key(i)] = ls.getItem(k); " \ "return items; ") def __iter__(self): return self.items().__iter__() def __repr__(self): return self.items().__str__() driver =webdriver.Chrome() storage = LocalStorage(driver).goto() print(storage)
问题排查与修复
核心问题
原JS循环的i < ls.length条件存在缺陷:localStorage的length属性是实时动态的,如果遍历过程中页面JS对localStorage有修改(比如新增/删除键),会导致循环提前终止或跳过部分键;另外部分浏览器环境下,ls.key(i)在i接近length时可能返回null,也会导致取值失败。
修复后的完整代码
from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait class LocalStorage: def __init__(self, driver: webdriver): self.driver = driver def goto(self): self.driver.get("https://tribune.com.pk") # 可选:等待localStorage加载完成,避免页面未初始化完就获取 WebDriverWait(self.driver, 10).until( lambda d: d.execute_script("return window.localStorage.length > 0") ) return self def __len__(self): return self.driver.execute_script("return window.localStorage.length;") def items(self): # 先一次性获取所有键名,再遍历取值,避免动态length的影响 return self.driver.execute_script(""" const ls = window.localStorage; const items = {}; for (const key of Object.keys(ls)) { items[key] = ls.getItem(key); } return items; """) def __iter__(self): return self.items().__iter__() def __repr__(self): return str(self.items()) driver = webdriver.Chrome() try: storage = LocalStorage(driver).goto() print(storage) finally: driver.quit()
关键修改点
- 移除无用导入:删掉
from webbrowser import Chrome,这行代码完全没用,还会和Selenium的Chrome驱动混淆 - 优化JS遍历逻辑:用
Object.keys(ls)一次性获取所有键名,再通过for...of循环遍历,彻底规避length动态变化的问题 - 添加等待机制:可选的显式等待,确保页面localStorage已经完成初始化,避免因页面加载时序问题导致获取空数据
- 代码规范:修复了原代码中不一致的缩进问题,添加
try...finally确保驱动正常关闭
内容的提问来源于stack exchange,提问作者ZA09
相关产品推荐
相关产品推荐

