WebDriver.get()执行完成后,后续WebDriverWait()如何维持浏览器打开至条件满足?
核心原理说明
你观察到的「仅调用driver.get()后浏览器快速关闭」本质和driver.get()本身无关:Python脚本所有代码执行完毕后进程会退出,WebDriver实例被垃圾回收时会自动发送指令关闭关联的浏览器窗口,才会出现你看到的快速关闭现象。
为什么WebDriverWait/sleep能维持浏览器窗口打开?
WebDriverWait(driver, timeout).until(xxx)和time.sleep(10)都属于阻塞当前脚本执行的操作:
- 对于
time.sleep:脚本会直接暂停固定时长,期间不会执行任何后续代码,脚本进程不退出,WebDriver实例就不会被销毁,浏览器自然不会关闭 - 对于
WebDriverWait:脚本会按照固定间隔轮询检测你指定的预期条件是否满足,直到条件命中或超时才会继续向下执行,在轮询阶段脚本一直处于运行状态,同样不会触发WebDriver销毁逻辑,浏览器窗口就会一直保留
你提供的两段代码的现象本质都是「阻塞脚本执行,延后了WebDriver实例销毁的时机」,才让浏览器窗口维持打开。
注意:二者只是表面效果类似,实际生产环境优先用WebDriverWait的显式等待方案,不用固定时长的sleep:显式等待只要元素加载完成就会立刻向下执行,执行效率更高,也不会出现网络差时sleep时长不够依然找不到元素的问题。
是否需要调整调用逻辑?
你现在的调用顺序driver.get() -> 定义预期条件 -> WebDriverWait等待完全符合Selenium的最佳实践,不需要调整:driver.get()默认只会等待页面的load事件触发就返回,现在绝大多数站点都有异步渲染逻辑(JS动态生成页面元素),load事件触发时你要操作的元素大概率还没渲染完成,直接操作会抛出NoSuchElementException,在get之后加显式等待是标准的兼容方案。
内容的提问来源于stack exchange,提问作者neikel
相关产品推荐
相关产品推荐

