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

定义login函数后SeleniumBase脚本元素定位失败,删除后正常求原因

问题:SeleniumBase脚本定义login函数后无法定位Cookie按钮的原因

我正在学习Python,尝试使用SeleniumBase编写VFS Global登录页面的自动化脚本,脚本内容如下:

from seleniumbase import SB
from time import sleep  # 原脚本遗漏该导入,补充后才能正常运行sleep方法

# OPEN LOGIN PAGE
with SB(uc=True) as sb:
    sb.driver.uc_open_with_reconnect(
        "https://visa.vfsglobal.com/egy/en/hrv/login",
        reconnect_time=12
    )
    print("Site: VFS Global OPEN LOGIN PAGE >>>> Success")

# Define functions
def login():
    # Search For Cookies
    sb.click("#onetrust-reject-all-handler")
    sleep(3)

while True:
    try:
        login()
    except Exception as e:
        print(f'Error encountered: {e}')
    finally:
        sleep(2)
        quit()  # 缩进需调整,原脚本此处存在缩进问题

运行后终端输出:

Site: VFS Global OPEN LOGIN PAGE >>>> Success Error encountered: Message:   
    Element {#onetrust-reject-all-handler} was not present after 7 seconds!

但删除def login():后脚本可正常执行,请教问题原因。


原因分析

核心问题是变量作用域与with语句的生命周期限制:

  1. sb对象是在with SB(uc=True) as sb:代码块内创建的,with语句的特性是:代码块执行完毕后,会自动调用对象的退出方法,销毁sb对应的浏览器会话、释放资源。
  2. 你将login()函数定义在with代码块外部,当进入while True循环调用login()时,sb已经不是有效的浏览器会话对象——此时浏览器已被关闭,自然找不到页面上的Cookie按钮元素,抛出找不到元素的错误。
  3. 当删除def login():,把sb.click("#onetrust-reject-all-handler")直接放到with代码块内部时,sb还处于有效的会话周期内,能正常操作浏览器页面,所以脚本可以执行成功。

另外补充脚本里的两个小问题:

  • 原脚本遗漏from time import sleep导入,运行时会触发NameError: name 'sleep' is not defined错误;
  • while True循环里的quit()会直接终止程序,循环实际只会执行一次,逻辑上没必要使用循环。

内容的提问来源于stack exchange,提问作者Saber Abd ElHalim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 02:33:17