selenium如何连接已经打开的浏览器

前言

当我们在使用selenium做一些不可描述的事时,因为我们代码的失误导致Python程序报错终止了。如果这个时候去重新运行Python程序,那么你前面已经测试的也要重新来过,所以我们需要使用已经创建的浏览器。这样就可以接着上一步的操作。

那么,如何使用上一个已经存在的浏览器呢?我找到了两种解决方案。

第一种

selenium虽然没有提供连接它自己创建的浏览器实例,但是却可以连接通过–remote-debugging-port=12306这个参数启动的chrome浏览器。什么意思呢?我们先使用命令行启动一个chrome,命令如下:

chrome所在路劲\chrome.exe --remote-debugging-port=12306

chrome所在路劲一般是C:\Users\Administrator\AppData\Local\Google\Chrome\Application\

Python使用刚才启动的浏览器,代码如下:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_experimental_option("debuggerAddress", "127.0.0.1:12306")
driver = webdriver.Chrome(options=options)

这样就能达到重复使用一个浏览器的效果了,不过我总感觉这个用于测试效果还行。因为浏览器一旦启动,你的Python代码所加的参数不会再生效了,就比如–proxy-server等,当然你也可以一开始就在启动chrome的时候加上,效果是一样的。这个解决方法可以解决大部分问题。另外,这个是真实启动的浏览器,并不会有selenium的一些特征值,比如window.navigator.webdriver都是undefined,这对于爬虫而言又提供了一种便利。

第二种

参照博客:https://www.cnblogs.com/jhao/p/8267929.html

博客的大概意思是,selenium驱动浏览器需要有一个通信的url和一个sessionID,我们只要拿到这两个值就可以重新连接由selenium启动的浏览器。而这两个值都是driver的属性可以直接获取。代码如下:

from selenium import webdriver

driver = webdriver.Chrome()
executor_url = driver.command_executor._url 
session_id = driver.session_id
driver.get("https://www.baidu.com/")

print(session_id)
print(executor_url)

driver2 = webdriver.Remote(command_executor=executor_url, desired_capabilities={})
driver2.session_id = session_id
print(driver2.current_url)
driver2.get('https://www.google.com')

代码中第一个driver启动了一个浏览器并访问了百度,然后我们使用了第二个driver也可以去操作它。但是这个代码有个小小的问题,第二个driver连接的时候顺带又启动了一个窗口。因为我们给他重新赋值了一个session_id,所以顺带的那个窗口会变得无法操作,怎么办呢?关闭它不就行了。在driver.session_id = session_id这个代码前加一句driver.close()就行了。

不过博客的大佬可能觉得这样操作有点low,他想的是我让它不创建新浏览器窗口不就行了,怎么办呢?找到相应的源码,重写一下(大佬到底还是大佬)。不过大佬已经给出完整代码,我们只需要复制下来用就行了。

既然只要通信的url和sessionID就能连接,那我能不能在使用selenium时指定这两个的值呢?可以看出通信url就是个本地地址加一个端口,我看了一下webdriver的代码发现driver.Chrome()这个类有个port的参数,试了一下发现这个参数就是通信url的端口。既然端口可以指定,那sessionID呢?也许能,但我不会,没有相应的参数可以指定,也看不懂源码是在哪里生成的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章