基本功能:

执行脚本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的更多相关文章

  1. 使用python+selenium控制手工已打开的浏览器

    我们可以利用Chrome DevTools协议.它允许客户检查和调试Chrome浏览器. 打开cmd,在命令行中输入命令: chrome.exe --remote-debugging-port=922 ...

  2. 用selenium控制已打开的浏览器

    在使用selenium进行自动化测试会遇到,手工打开浏览器,做了一部分操作后,并打开相关页面后再执行相关的自动化脚本. 如何使用selenium来接管先前已打开的浏览器呢?醍提出一个Google Ch ...

  3. selenium+python自动化105 - selenium 如何在已打开的浏览器上继续运行自动化脚本?

    前言 使用selenium 做web自动化的时候,经常会遇到这样一种需求,是否可以在已经打开的浏览器基础上继续运行自动化脚本? 这样前面的验证码登录可以手工点过去,后面页面使用脚本继续执行,这样可以解 ...

  4. DATEADD和DATEDIFF函数、其他日期处理方法 、已打开的端口、FORMAT函数

    DATEADD和DATEDIFF函数.其他日期处理方法 .已打开的端口.FORMAT函数 DATEADD和DATEDIFF函数.其他日期处理方法 .已打开的端口.Format函数 KeyLife富翁笔 ...

  5. Python Cookbook(第3版)中文版:15.18 传递已打开的文件给C扩展

    15.18 传递已打开的文件给C扩展¶ 问题¶ 你在Python中有一个打开的文件对象,但是需要将它传给要使用这个文件的C扩展. 解决方案¶ 要将一个文件转换为一个整型的文件描述符,使用 PyFile ...

  6. executequery要求已打开且可用的connection,连接的当前状态为已关闭

    问题: executequery要求已打开且可用的connection,连接的当前状态为已关闭 错误原因: 连接的当前状态为已关闭.或者只创建了Connection对象,没有调用Connection. ...

  7. C-Lodop提示“有窗口已打开,先关闭它(持续如此请刷新页面)!”

    c-lodop显示“有窗口已打开,先关闭它(持续如此时请刷新页面)!”如果连续执行多个预览语句等导致的,可以预先判断一下,并可以自定义修改窗口已打开的提示,该默认提示的位置如本博客的下图http:// ...

  8. UNIX环境编程学习笔记(5)——文件I/O之fcntl函数访问已打开文件的性质

    lienhua342014-08-29 fcntl 函数可以改变已打开的文件的性质. #include <fcntl.h> int fcntl(int filedes, int cmd, ...

  9. openfiles_(命令)查看已打开的文件列表

    效果: 功能: 查看Windows系统的进程信息,包括进程打开了哪些文件 描述: 允许管理员列出系统上已打开的文件和文件夹或与其断开连接. 参数列表: /Disconnect 中断至少一个打开的文件的 ...

随机推荐

  1. activi7流程部署

    package com.zcc.acvitivi; import org.activiti.engine.ProcessEngine;import org.activiti.engine.Proces ...

  2. camunda授权的一些简单操作

    /** * 授权操作 */public class ZccAuthorizationService { AuthorizationService authorizationService; @Befo ...

  3. PHP 图片裁切

    PHP CLASS TO CREATE IMAGE THUMBANILS Some years ago, I wrote a PHP class to create image thumbnails ...

  4. Zabbix Server 和 Zabbix Agentd 开机自动运行

    Zabbix Server 和 Zabbix Agentd 开机自动运行 请问:怎样 Zabbix Server 和 Zabbix Agentd 开机自动运行? 注:如果你的命令行写进了 /etc/r ...

  5. Clairewd's message /// 字符串hash

    题目大意: 给定字符串s 是26个字母对应的密文字母 给定字符串c1 是 密文+部分原文 原文可能缺损 要求将原文补全输出 利用s得到密文字母对应的原字母rs 利用rs翻译c1得到 原文+部分密文c2 ...

  6. webpack--前端自动化工具

    一.下载与安装 //全局安装webpack (不推荐) npm i webpack -g npm i webpack-cli -g //局部安装(推荐) npm i webpack -D npm i ...

  7. 理解EntityFramework两个核心类型的职责 DbSet和D'bContext

    DbSet与DbContext是多对一的关系DbSet是实体对象的集合,提供了实现CRUD的相应方法DbContext封装与数据库和数据模型相关的功能,依据数据实体状态创建SQL命令,将数据更改保存到 ...

  8. freemarker在web应用项目的使用

    FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出.FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP.它不仅可以用作表现层的实现 ...

  9. Android编程之Listener侦听的N种写法及实现原理

    写下这个题目时突然想起鲁迅笔下的孔乙已,茴香豆的几种写法,颇有些咬文嚼字的味道.虽然从事手机编程多年,但一直使用的是C和C++编程,由于安卓早期只支持JAVA开发,所以对于时下如火如荼的安卓系统,我一 ...

  10. 文件对比工具 diff cmp patch(没弄完) pr

    diff不仅可以对比文件,而且可以对比文件夹中的文件. 解析: diff用在比对两个文件的差异,并且是以行为单位进行对比.一般用在ascii纯文本档的对比上. 例 在tmp中创建一个testpw文件夹 ...