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

跨文件调用函数时未识别已定义的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 09:05:35