如何在Python Selenium中调用类函数后复用同一浏览器实例继续测试
解决Python Selenium共享浏览器实例的问题
核心问题分析
你当前的代码存在几个关键问题导致无法复用浏览器实例:
- 主测试脚本没有接收
LoginTestProject函数返回的浏览器实例,反而试图依赖全局变量driver跨模块访问,这很容易导致变量未定义或作用域混乱。 - 函数内
return语句后的代码永远不会执行,属于无效代码。 - 测试脚本中的XPATH多了一个多余的斜杠,导致元素定位失败。
- 大量使用
time.sleep硬等待,容易因页面加载速度差异导致元素找不到。
修复方案(规范写法)
1. 修正函数文件(Login2.py)
去掉全局变量,直接创建并返回浏览器实例,同时用显式等待替代硬等待:
import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def LoginTestProject(): # 初始化浏览器实例 driver = webdriver.Chrome() driver.get('https://www.bbc.co.uk/news') driver.maximize_window() wait = WebDriverWait(driver, 20) # 显式等待世界板块按钮可点击后点击 world_button = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="orb-modules"]/header/div[2]/div[1]/div[1]/nav/ul/li[6]/a'))) world_button.click() # 显式等待非洲板块按钮可点击后点击 africa_button = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="orb-modules"]/header/div[2]/div[2]/div[1]/nav/ul/li[1]/a'))) africa_button.click() time.sleep(2) # 可替换为等待页面加载完成的显式条件 return driver # 返回浏览器实例供主脚本复用
2. 修正测试文件
接收函数返回的浏览器实例,修复XPATH错误,并使用显式等待:
from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time # 导入正确的函数 from TestingProject.Pages.Login2 import LoginTestProject # 接收函数返回的浏览器实例,实现复用 driver = LoginTestProject() wait = WebDriverWait(driver, 20) # 修复XPATH的多余斜杠,显式等待元素可点击后操作 target_element = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="topos-component"]/div/div[1]/div/div[3]/div/div[1]/div/div[2]/div[1]/a/h3'))) target_element.click() time.sleep(2) driver.quit()
关键说明
- 用函数返回值传递浏览器实例是最规范的方式,避免全局变量带来的作用域问题。
- 显式等待(
WebDriverWait+ 预期条件)比time.sleep更可靠,能根据页面实际加载状态等待,减少测试不稳定的情况。 - 测试脚本中必须显式接收返回的
driver对象,否则主脚本中的driver变量会因未定义报错。
内容的提问来源于stack exchange,提问作者newb81
相关产品推荐
相关产品推荐

