定义login函数后SeleniumBase脚本元素定位失败,删除后正常求原因
我正在学习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语句的生命周期限制:
sb对象是在with SB(uc=True) as sb:代码块内创建的,with语句的特性是:代码块执行完毕后,会自动调用对象的退出方法,销毁sb对应的浏览器会话、释放资源。- 你将
login()函数定义在with代码块外部,当进入while True循环调用login()时,sb已经不是有效的浏览器会话对象——此时浏览器已被关闭,自然找不到页面上的Cookie按钮元素,抛出找不到元素的错误。 - 当删除
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
相关产品推荐
相关产品推荐

