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

本地Selenium Python多浏览器多URL测试脚本优化咨询

优化多浏览器多URL的Selenium测试脚本方案

需求:本地运行测试脚本,在Chrome和Firefox浏览器中遍历指定URL,获取每个页面的localStorage和sessionStorage数据,现有实现代码需要优化。

原代码

import time
from selenium import webdriver


driver_array = [webdriver.Firefox(), webdriver.Chrome()]
sites = [
    "http://www.github.com",
    "https://tribune.com.pk"
]


for index, browser in enumerate(driver_array):
        print(index, browser)
        for index, site in enumerate(sites):
            print(index,site)
            browser.get(site)
            time.sleep(5)
            # localitems()
            # sessionitems()
            # def localitems() :
            local_storage = browser.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; ")
            print(local_storage)

            # def sessionitems() :
            session_storage = browser.execute_script( \
                    "var ls = window.sessionStorage, items = {}; " \
                    "for (var i = 0, k; i < ls.length; ++i) " \
                    "items[k = ls.key(i)] = ls.getItem(k);"\
                    "return items; ")
            print(session_storage)

优化方向与实现

1. 封装重复的存储获取逻辑

两段获取Storage的JS代码几乎一致,封装成通用函数减少冗余:

def get_storage(driver, storage_type):
    return driver.execute_script(f"""
        var storage = window.{storage_type}, items = {{}};
        for (var i = 0, k; i < storage.length; ++i) {{
            items[k = storage.key(i)] = storage.getItem(k);
        }}
        return items;
    """)

2. 用显式等待替代固定sleep

固定time.sleep(5)不够灵活,改用显式等待页面加载完成,更高效稳定:

from selenium.webdriver.support.ui import WebDriverWait

# 等待页面完全加载(document.readyState为complete)
WebDriverWait(driver, 10).until(
    lambda d: d.execute_script('return document.readyState') == 'complete'
)

3. 用上下文管理器管理浏览器驱动

确保浏览器自动关闭,避免进程残留:

with webdriver.Firefox() as firefox_driver:
    # 执行测试逻辑
    pass

4. 优化变量名与日志输出

嵌套循环避免重复使用index,用更清晰的变量名,日志输出更直观。

5. 添加异常处理

防止单个URL或浏览器出错导致脚本中断,提升鲁棒性。

完整优化代码

import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait

def get_storage(driver, storage_type):
    """获取指定类型的存储数据:localStorage 或 sessionStorage"""
    return driver.execute_script(f"""
        var storage = window.{storage_type}, items = {{}};
        for (var i = 0, k; i < storage.length; ++i) {{
            items[k = storage.key(i)] = storage.getItem(k);
        }}
        return items;
    """)

def test_sites_in_browser(driver, sites):
    """在单个浏览器中遍历所有URL并获取存储数据"""
    for site_idx, site_url in enumerate(sites, 1):
        print(f"=== 测试第{site_idx}个URL: {site_url} ===")
        try:
            driver.get(site_url)
            # 等待页面完全加载
            WebDriverWait(driver, 10).until(
                lambda d: d.execute_script('return document.readyState') == 'complete'
            )
            # 获取并打印存储数据
            local_storage = get_storage(driver, "localStorage")
            print(f"localStorage: {local_storage}")
            
            session_storage = get_storage(driver, "sessionStorage")
            print(f"sessionStorage: {session_storage}")
            
        except Exception as e:
            print(f"测试URL {site_url} 出错: {str(e)}")
        print("---")

if __name__ == "__main__":
    sites = [
        "http://www.github.com",
        "https://tribune.com.pk"
    ]
    # 遍历浏览器类型
    browser_configs = [
        ("Firefox", webdriver.Firefox),
        ("Chrome", webdriver.Chrome)
    ]
    
    for browser_name, browser_cls in browser_configs:
        print(f"\n===== 使用 {browser_name} 浏览器测试 =====")
        try:
            with browser_cls() as driver:
                test_sites_in_browser(driver, sites)
        except Exception as e:
            print(f"{browser_name} 浏览器初始化或测试出错: {str(e)}")

优化后的优势

  • 代码结构清晰,复用性强,后续新增存储类型或URL只需修改对应部分
  • 显式等待更高效,减少不必要的等待时间
  • 上下文管理器确保浏览器资源正确释放,不会残留后台进程
  • 异常处理让脚本更健壮,单个测试点失败不影响整体执行
  • 日志输出更直观,便于定位问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 19:35:29