跨文件调用函数时未识别已定义的driver对象问题排查
解决跨文件调用Selenium登录后driver未定义的问题
你遇到的NameError是因为file1.py里的driver是模块内的全局变量,file2.py无法直接访问到这个变量。而且用全局变量管理Selenium实例在Behave框架里不是合理的做法,Behave的context对象本来就是用来在不同步骤、不同模块间共享数据的,应该用它来存储driver实例。
方案1:通过Behave的context传递driver实例(推荐)
修改file1.py
把driver实例绑定到context属性上,让所有步骤都能通过context访问同一个driver:
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By def login(context): s = Service("C:pythonProject/chromedriver.exe") # 将driver存储到context中,替代全局变量 context.driver = webdriver.Chrome(service=s) context.driver.maximize_window() def username(context): url = "https://www.bbc.com" # 从context中获取driver context.driver.get(url) context.driver.implicitly_wait(10) search = context.driver.find_element(By.ID, "user") search.send_keys('xxxxx') search = context.driver.find_element(By.ID, "pass") search.send_keys('xxxxx') context.driver.find_element(By.ID, "log_in_button").click()
修改file2.py
所有操作通过context.driver访问,不再直接引用全局变量:
from behave import * from file1 import * from selenium.webdriver.common.by import By @given(u'sdsd') def step_impl(context): login(context) username(context) @when(u'sdds') def step_impl(context): # 从context中获取driver实例 search = context.driver.find_element(By.ID, "headerBar")
补充:添加driver清理逻辑
为避免测试后残留浏览器进程,在项目根目录创建environment.py,添加清理步骤:
from behave import * def after_scenario(context, scenario): # 测试结束后关闭driver if hasattr(context, 'driver'): context.driver.quit()
方案2:让login函数返回driver实例(适合非Behave场景)
如果不用Behave的context,也可以让login函数返回driver,在调用时接收并传递:
修改file1.py
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By def login(): s = Service("C:pythonProject/chromedriver.exe") driver = webdriver.Chrome(service=s) driver.maximize_window() return driver def username(driver): url = "https://www.bbc.com" driver.get(url) driver.implicitly_wait(10) search = driver.find_element(By.ID, "user") search.send_keys('xxxxx') search = driver.find_element(By.ID, "pass") search.send_keys('xxxxx') driver.find_element(By.ID, "log_in_button").click()
修改file2.py
from behave import * from file1 import * from selenium.webdriver.common.by import By @given(u'sdsd') def step_impl(context): # 接收login返回的driver,并存到context里 context.driver = login() username(context.driver) @when(u'sdds') def step_impl(context): search = context.driver.find_element(By.ID, "headerBar")
内容的提问来源于stack exchange,提问作者V10
相关产品推荐
相关产品推荐

