You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

关键修改点

  1. 移除无用导入:删掉from webbrowser import Chrome,这行代码完全没用,还会和Selenium的Chrome驱动混淆
  2. 优化JS遍历逻辑:用Object.keys(ls)一次性获取所有键名,再通过for...of循环遍历,彻底规避length动态变化的问题
  3. 添加等待机制:可选的显式等待,确保页面localStorage已经完成初始化,避免因页面加载时序问题导致获取空数据
  4. 代码规范:修复了原代码中不一致的缩进问题,添加try...finally确保驱动正常关闭

内容的提问来源于stack exchange,提问作者ZA09

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 03:40:31