Selenium二次打开网站触发InvalidSessionIdException报错求助
问题原因
你碰到的InvalidSessionIdException,本质是第一次执行driver.close()后,当前的浏览器会话已经彻底结束,手里的driver对象变成了无效的“空壳”。第二次再用这个失效的driver去打开网页,自然会报错说会话ID无效。
另外你的代码里还有个小bug:click()函数未定义,你导入了pyautogui,得写成pyautogui.click()才能正常执行点击操作。
修复后的代码
要实现重复打开无痕窗口执行操作,每次都得重新创建全新的浏览器会话。把操作逻辑封装成函数,每次调用函数时重新初始化浏览器即可:
from selenium import webdriver import time import pyautogui import win32api, win32con def do_task(): # 每次执行任务都新建一个无痕浏览器实例 options = webdriver.ChromeOptions() options.add_argument("--incognito") # 新版本Selenium直接传options即可,无需转成capability driver = webdriver.Chrome(options=options) try: driver.get("替换成你的目标URL") time.sleep(1) driver.execute_script("window.scrollTo(0, 3000)") win32api.SetCursorPos((834, 258)) time.sleep(0.1) pyautogui.click() # 补全pyautogui前缀,否则找不到click函数 time.sleep(0.5) finally: # 用quit彻底关闭浏览器和会话,比close清理更彻底 driver.quit() time.sleep(0.5) # 执行两次任务 do_task() do_task()
关键说明
- 用
driver.quit()代替driver.close():close()仅关闭当前标签页,若只剩最后一个标签页浏览器也会关闭,但会话可能未完全清理;quit()会直接终止整个浏览器进程,彻底清除会话,避免留下无效对象。 - 直接传
options:新版本Selenium已不推荐使用desired_capabilities,直接将配置好的options传给webdriver.Chrome()即可,代码更简洁。 - 封装函数:把重复操作打包成函数,后续要执行多次只需调用函数,代码更整洁易维护。
内容的提问来源于stack exchange,提问作者Ever
相关产品推荐
相关产品推荐

