admin 管理员组文章数量: 887021
因为Webdriver每次实例化都会新开一个全新的浏览器会话,在有些情况下需要复用之前打开未关闭的会话。比如爬虫,希望结束脚本时,让浏览器处于空闲状态。当脚本重新运行时,它将继续使用这个会话工作。还就是在做自动化测试时,前面做了一大推操作,但是由于程序出错,重启时不用再继续前面复杂的操作。
个人觉得这种功能非常有用,但是官方居然没有提供这种功能的API,苦苦搜搜,在网上找了两个java版的http://blog.csdn/wwwqjpcom/article/details/51232302 和 http://woxiangbo.iteye/blog/2372683
看了下源码其实java和python的驱动原理过程都非常相似。
打开一个Chrome会话:
运行上面的脚本,它将启动浏览器并退出。因为没有调用quit()方法,所以浏览器会话仍会存在。但是代码里创建的driver对象已经不在了,理论上不能用脚本控制这个浏览器。它将变成一个僵尸浏览器,只能手动杀死它。
通过webdriver启动一个浏览器会话大概会有这样三个阶段:
1、启动的浏览器驱动代理(hromedriver,Firefox的驱动程序,等等);
2、创建一个命令执行器。用来向代理发送操作命令;
3、使用代理建立一个新的浏览器会话,该代理将与浏览器进行通信。用sessionId来标识会话。
因此只要拿到阶段2中的执行器和阶段3中的sessionID就能恢复上次的会话。这两个有api可以直接获取:
得到类似这样的输出(第一个是会话的sessionId,第二个就是命令执行器连接):
一切就绪,下面就开始实现复用之前会话的功能,在Stack Overflow上面讲的实现是这样的:
可能是因为版本原因吧,反正在我环境中运行时,效果是实现了,能够重新连接到上一个会话,但是却打开了一个新的空白会话。看了下Remote类的源码,发现是因为每次实例化都会调用start_session这个方法新建一个会话。所以解决方法就是继承并重写这个类。自定义一个ReuseChrome这个类重写start_session方法使它不再新建session,使用传入的session_id:
然后在第二次连接是使用重写的ReuseChrome类:
.
这样就能顺利连接到上次没关闭的浏览器会话。
版权声明:本文标题:Python Webdriver 重新使用已经打开的浏览器实例 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1726855118h1040186.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论