本地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
相关产品推荐
相关产品推荐

