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()

版权申明:本文为博主原创文章,转载请保留原文链接及作者。

原文地址:https://www.cnblogs.com/df888/p/11741794.html

时间: 2024-10-20 08:57:34

webdriver使用已打开过的chrome的相关文章

Selenium Webdriver重新使用已打开的浏览器实例

本文中的样例均使用SoapUI ,关于SoapUI+Webdriver 的配置,请看上一篇: http://blog.csdn.net/wwwqjpcom/article/details/51174664 我弄这个的本意是为了在SoapUI中更好地编写自动化用例,因为我的业务流程有的很长,有7-8个页面. 我想把代码不集中在一个Groovy 脚本里,想在第二个脚本中继续使用第一个脚本中打开的浏览器.这样便于 维护和定位问题. 也还有一种情况是我打开了浏览器,,操作了系统到某一个界面后,我写了这个

Photoshop脚本 > 关闭所有已打开的文档

源自:http://coolketang.com/tutorials/menu2lesson11.php 本节将演示如何使用脚本,快速关闭已打开的所有文档.首先创建一个空白的脚本文档,并保存在硬盘上某个位置. 首先创建一个空白的脚本文档,并保存在硬盘上某个位置. 接着输入脚本代码: //使用[while]创建一个循环语句,循环执行大括号里的动作. //直到while后面的条件为false,即当前Photoshop程序不存在打开的文档了. while(app.documents.length > 

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

lienhua342014-08-29 fcntl 函数可以改变已打开的文件的性质. #include <fcntl.h> int fcntl(int filedes, int cmd, ... /* int arg */); fcntl 函数有 5 种功能: 1. 复制一个现有的描述符(cmd=F_DUPFD). 2. 获取/设置文件描述符标志(cmd=F_GETFD 或F_SETFD). 3. 获取/设置文件状态标志(cmd=F_GETFL 或F_SETFL). 4. 获取/设置异步 I/

windows10下安装Microsoft Visual Studio 2013.4 Community enu中文语言包出错,提示“”程序兼容模式已打开.请将其关闭”的解决方法

原来win8系统用着有点慢,就选择重新安装系统,安装了win10预览版,感觉确实很不一样,呵呵.在安装了vs2013社区版后,默认是英文版的,因为英文不太好,需要安装简体中文语言包,但是安装时一直报“程序兼容模式已打开,请将其关闭然后重新运行安装程序”, 在使用兼容win8模式安装后仍然提示这个,郁闷了好几天,后来在网上找到一个解决办法,记录如下: 使用命令提示符打开vs_langpack.exe,在后面添加 /Uninstall,类似这样D:\tools\vslang>vs_langpack.

RegQueryValueEx检索一个已打开的注册表句柄中,指定的注册表键的类型和设置值。

1VC声明 1 2 3 4 5 6 7 8 LONG RegQueryValueEx(     HKEY hKey,            // handle to key     LPCTSTR lpValueName,  // value name     LPDWORD lpReserved,   // reserved     LPDWORD lpType,       // type buffer     LPBYTE lpData,        // data buffer    

要求已打开且可用的 Connection。连接的当前状态为已关闭。

C#使用OleDB操作ACCESS Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + NewFileName + ";User Id=uid;Jet OLEDB:Database Password=pwd;"; 完整错误信息: {System.InvalidOperationException: ExecuteScalar 要求已打开且可用的 Connection.连接的当前状态为已关闭. 在 System.Data.OleDb

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

问题: executequery要求已打开且可用的connection,连接的当前状态为已关闭 错误原因: 连接的当前状态为已关闭.或者只创建了Connection对象,没有调用Connection.Open()方法: 也就是:connection.State != ConnectionState.Closed 解决方法: 调用Connection.Open()方法: 原文地址:https://www.cnblogs.com/jlutiger/p/9337709.html

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

效果: 功能: 查看Windows系统的进程信息,包括进程打开了哪些文件 描述: 允许管理员列出系统上已打开的文件和文件夹或与其断开连接. 参数列表: /Disconnect 中断至少一个打开的文件的连接. /Query 显示所有从本地或从共享文件夹打开的文件. /Local 启用 / 禁用本地打开文件的显示. 原文地址:https://www.cnblogs.com/feiyucha/p/9932050.html

webdriver打开失败方法---chrome与chromedrvier版本对应关系

在运行selenium脚本时,有时突然会碰到提示webdriver打开失败,这个时候极大可能是 Chrome浏览器更新了,与你之前的chromedriver版本出现不兼容,导致selenium调用不了 谷歌浏览器,这个时候就需要升级chromedriver,升级完即可. 查看一下自己的chrome版本和对应的chromedriver版本是否对应; 学习更多可以加QQ群:610845268