Selenium场景下,如何在单会话多页面间保留JavaScript值?
解决Selenium多页面跳转后点击数据丢失的问题
我用Python+Selenium实现了一个功能:启动Chrome浏览器后,用户点击页面元素时,通过driver.execute_async_script执行的JavaScript脚本会捕获点击元素的outerHTML和整个DOM的outerHTML;按下ESC键时返回数据并关闭窗口。但遇到一个问题——用户在原页面点击后跳转新页面继续操作,原页面的点击数据会丢失,因为DOM更新后新脚本无法获取之前的数据。
之前尝试把array_events存入localStorage或sessionStorage但未成功,现在提供修正后的可直接使用的JavaScript代码,通过sessionStorage实现单会话内多页面间的数据留存:
//Callback function var done = arguments[arguments.length - 1]; //从sessionStorage加载已有的事件数据,若无则初始化空数组 var array_events = JSON.parse(sessionStorage.getItem('clickEvents')) || []; var saveToSessionStorage = () => { sessionStorage.setItem('clickEvents', JSON.stringify(array_events)); }; var registerOuterHtml = (e) => { array_events.push(e.target.outerHTML); saveToSessionStorage(); } var whole = (e) => { array_events.push(document.documentElement.outerHTML); saveToSessionStorage(); } var quit = (key) => { if(key.keyCode == 27){ //返回数据后清空sessionStorage sessionStorage.removeItem('clickEvents'); done(array_events); } } //页面卸载前保存数据 window.addEventListener('beforeunload', saveToSessionStorage); // Listen to the clicks document.addEventListener("click", registerOuterHtml, true); document.addEventListener("click", whole, true); // Listen to the key "esc" which means user has gathered all needed events document.addEventListener("keydown", quit, true);
关键逻辑说明:
- 脚本初始化时优先从sessionStorage读取已有的点击数据,无数据则创建空数组
- 每次捕获到点击事件后,立即将数据同步保存到sessionStorage
- 监听
beforeunload事件,确保页面跳转或卸载前强制保存当前数据 - 按下ESC键返回数据后,清空sessionStorage内容,避免影响后续会话
内容的提问来源于stack exchange,提问作者RifloSnake
相关产品推荐
相关产品推荐

