webdriver使用已打开过的chrome
基本功能:
执行脚本a,打开一个chrome,脚本a执行完成,chrome未关闭。
执行脚本b,继续使用a打开的chrome,不新启浏览器。
附加:
如果已打开的chrome未关闭,则在chrome中新建标签页来打开新的页面。
如果已打开的chrome已关闭,则新启浏览器。
最近用python+selenium+pytest,写了个测试小工具用来自动化登陆浏览器,一方面是方便管理网址、账号、密码,存放在脚本中,另一方面也省去了频繁输入登陆网站的操作,节省了不少时间。
但这个小工具用起来存在明显问题:每次都新启一个浏览器,多了后就是这样的

根本不知道谁是谁。
于是就想到要实现前面提到的这些功能。
首先要解决的第一个问题就是,怎么重新使用已打开的chrome。百度后知晓,是通过session_id。浏览器都有一个session_id,拿到这个session_id就可以通过webdriver.Remote去调chrome。
driver = webdriver.Chrome()
params["session_id"] = driver.session_id
params["server_url"] = driver.command_executor._url
driver = webdriver.Remote(command_executor=params["server_url"])
driver.session_id = params["session_id"]
经过试验,python存在一个坑是每次初始化就会调start_session去新开一个空白的浏览器。网上有解决方案是继承Remote,重写start_session方法。然而,仔细看完代码就发现,何必多此一举,直接quit()就搞定。
driver = webdriver.Remote(command_executor=params["server_url"])
driver.quit() # 退出start_session新开的空白浏览器
driver.session_id = params["session_id"]
quit是quit了,但driver还存在呀,所以还是多理清思路,才能避免走冤枉路。
然后要解决的第二个问题就是,如何在执行脚本b的时候再接着用session。当然就是存本地咯。这里用到的是pickle,能很方便的在本地存取变量。
存
with open(session_file, 'wb') as f:
pickle.dump(params, f)
取
with open(session_file, 'rb') as f:
params = pickle.load(f)
第三个问题就是新开标签页和切换窗口。
driver.execute_script('window.open("");') # 调js
driver.switch_to.window(driver.window_handles[-1]) # 切换到最后一个页签
最后要解决的一个问题就是,如果已经打开的chrome关掉了,从本地文件读取的session就会过时。拿这个过时session去用,就会”chrome not reachable“。解决思路就是,捕获driver抛出的WebDriverException,重新创建新的driver。
try:
driver = webdriver.Remote(command_executor=params["server_url"])
driver.quit() # 退出start_session新开的空白浏览器
driver.session_id = params["session_id"]
driver.execute_script('window.open("");')
driver.switch_to.window(driver.window_handles[-1])
except:
driver = create_driver()
完整代码
session_file = 'browser_session.data'
def create_driver():
driver = webdriver.Chrome()
with open(session_file, 'wb') as f:
params = {"session_id": driver.session_id, "server_url": driver.command_executor._url}
pickle.dump(params, f)
return driver
if not Path(session_file).exists():
driver = create_driver()
else:
with open(session_file, 'rb') as f:
params = pickle.load(f)
try:
driver = webdriver.Remote(command_executor=params["server_url"])
driver.quit() # 退出start_session新开的空白浏览器
driver.session_id = params["session_id"]
driver.execute_script('window.open("");')
driver.switch_to.window(driver.window_handles[-1])
except:
driver = create_driver()
版权申明:本文为博主原创文章,转载请保留原文链接及作者。
webdriver使用已打开过的chrome的更多相关文章
- 使用python+selenium控制手工已打开的浏览器
我们可以利用Chrome DevTools协议.它允许客户检查和调试Chrome浏览器. 打开cmd,在命令行中输入命令: chrome.exe --remote-debugging-port=922 ...
- 用selenium控制已打开的浏览器
在使用selenium进行自动化测试会遇到,手工打开浏览器,做了一部分操作后,并打开相关页面后再执行相关的自动化脚本. 如何使用selenium来接管先前已打开的浏览器呢?醍提出一个Google Ch ...
- selenium+python自动化105 - selenium 如何在已打开的浏览器上继续运行自动化脚本?
前言 使用selenium 做web自动化的时候,经常会遇到这样一种需求,是否可以在已经打开的浏览器基础上继续运行自动化脚本? 这样前面的验证码登录可以手工点过去,后面页面使用脚本继续执行,这样可以解 ...
- DATEADD和DATEDIFF函数、其他日期处理方法 、已打开的端口、FORMAT函数
DATEADD和DATEDIFF函数.其他日期处理方法 .已打开的端口.FORMAT函数 DATEADD和DATEDIFF函数.其他日期处理方法 .已打开的端口.Format函数 KeyLife富翁笔 ...
- Python Cookbook(第3版)中文版:15.18 传递已打开的文件给C扩展
15.18 传递已打开的文件给C扩展¶ 问题¶ 你在Python中有一个打开的文件对象,但是需要将它传给要使用这个文件的C扩展. 解决方案¶ 要将一个文件转换为一个整型的文件描述符,使用 PyFile ...
- executequery要求已打开且可用的connection,连接的当前状态为已关闭
问题: executequery要求已打开且可用的connection,连接的当前状态为已关闭 错误原因: 连接的当前状态为已关闭.或者只创建了Connection对象,没有调用Connection. ...
- C-Lodop提示“有窗口已打开,先关闭它(持续如此请刷新页面)!”
c-lodop显示“有窗口已打开,先关闭它(持续如此时请刷新页面)!”如果连续执行多个预览语句等导致的,可以预先判断一下,并可以自定义修改窗口已打开的提示,该默认提示的位置如本博客的下图http:// ...
- UNIX环境编程学习笔记(5)——文件I/O之fcntl函数访问已打开文件的性质
lienhua342014-08-29 fcntl 函数可以改变已打开的文件的性质. #include <fcntl.h> int fcntl(int filedes, int cmd, ...
- openfiles_(命令)查看已打开的文件列表
效果: 功能: 查看Windows系统的进程信息,包括进程打开了哪些文件 描述: 允许管理员列出系统上已打开的文件和文件夹或与其断开连接. 参数列表: /Disconnect 中断至少一个打开的文件的 ...
随机推荐
- Redis Cluster 设置密码
两种方式 1.修改配置文件 在每个节点的配置文件里面增加密码选项,一定要加上 masterauth,不然 Redirected 的时候会失败. masterauth redispassword req ...
- inline-block 导致元素下沉 解决方法添加vertical-align:middle属性
<div class="layui-input-block"> <input name="username" lay-verify=" ...
- Xen的概况
1. Xen Live CD xen也有Live CD的形式,当然是少不了Dom 0的,有Apline Linux和Debian两种. 参见http://wiki.xen.org/wiki/LiveC ...
- input file转base64
不想用canvas转 <input type="file" id="file" accept="image/*" onchange=& ...
- leetcode python反转字符串中的单词
# Leetcode 557 反转字符串中的单词III### 题目描述 给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序. **示例1:** 输入: "L ...
- redis zset 介绍
$key = 'key'; //新增 zadd($key,分数,标识) //删除某个标识 zrem($key,标识) //查询某个标识的排名(从0开始的 所有在输出的时候要加一) zrevrank($ ...
- 逻辑回归原理,推导,sklearn应用
目录 逻辑回归原理,推导,及sklearn中的使用 1 从线性回归过渡到逻辑回归 2 逻辑回归的损失函数 2.1 逻辑回归损失函数的推导 2.2 梯度下降法 2.3 正则化 3 用逻辑回归进行多分类 ...
- Unity应用怎么暂停(Pause)
非常多时候,应用程序或者是游戏须要用上暂停功能,unity提供了不少便捷的方式,列在以下: 1.在editor中,按下pausebutton就可以暂停 2.假设在代码中控制,能够通过设置Time.ti ...
- SpringBoot开发详解(五)--Controller接收参数以及参数校验
原文链接:http://blog.csdn.net/qq_31001665 如有侵权,请联系博主删除博客,谢谢 Controller 中注解使用 接受参数的几种传输方式以及几种注解: 在上一篇中,我 ...
- Spark使用Java读取mysql数据和保存数据到mysql
原文引自:http://blog.csdn.net/fengzhimohan/article/details/78471952 项目应用需要利用Spark读取mysql数据进行数据分析,然后将分析结果 ...