接上篇 selenium 学习记录:StaleElementReferenceException 的处理,在学习课程页面发生了一点奇怪的问题。
问题
网站有一个课程列表页,点击具体的课程会打开新窗口进入课程页。
在浏览器上,课程页学习完毕并关闭后,列表页的进度也会更新。
在 selenium,课程页学习完毕并关闭后,列表页的进度没有更新,还是显示未学习完。
分析
观察到一个现象:在浏览器上,列表页的进度必须在关闭课程页之后才刷新;未关闭课程页的情况下,即使课程页显示已学习完毕,手工刷新列表页,进度还是没有更新。
因此推断,课程页可能是在关闭页面的时候会触发一个事件,发送更新学习进度的请求到服务器,这样服务器才更新学习进度。
关闭页面会触发浏览器的 onbeforeunload
事件,经验证,课程页的确注册了 onbeforeunload
事件的处理方法,并在其中发送更新进度的 ajax 请求。
然后通过 fiddler 抓包验证了一下:
- 在浏览器(chrome 86)上,关闭窗口可以看到
onbeforeunload
事件中的 ajax 请求 - 在selenium(chromedriver 86),通过
close
方法关闭窗口,无法看到onbeforeunload
事件中的ajax 请求
所以结论是 close
方法无法触发 onbeforeunload
事件中的 ajax 请求。
解决方法
虽然 close 方法无法触发 onbeforeunload
事件发送请求,但我可以通过调用 javascript 的方式,手工触发 onbeforeunload
事件,稍微等待下再关闭窗口,确保请求完成。
# 手工触发 onbeforeunload 事件
driver.execute_script('window.onbeforeunload()')
# 稍微等待下
time.sleep(1)
# 可以关闭窗口了
driver.close()