前言
当我们在使用selenium做一些不可描述的事时,因为我们代码的失误导致Python程序报错终止了。如果这个时候去重新运行Python程序,那么你前面已经测试的也要重新来过,所以我们需要使用已经创建的浏览器。这样就可以接着上一步的操作。
那么,如何使用上一个已经存在的浏览器呢?我找到了两种解决方案。
第一种
selenium虽然没有提供连接它自己创建的浏览器实例,但是却可以连接通过–remote-debugging-port=12306这个参数启动的chrome浏览器。什么意思呢?我们先使用命令行启动一个chrome,命令如下:
chrome所在路劲\ --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的一些特征值,比如都是undefined,这对于爬虫而言又提供了一种便利。
第二种
参照博客:/jhao/p/
博客的大概意思是,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("/")
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('')
代码中第一个driver启动了一个浏览器并访问了百度,然后我们使用了第二个driver也可以去操作它。但是这个代码有个小小的问题,第二个driver连接的时候顺带又启动了一个窗口。因为我们给他重新赋值了一个session_id,所以顺带的那个窗口会变得无法操作,怎么办呢?关闭它不就行了。在driver.session_id = session_id这个代码前加一句()就行了。
不过博客的大佬可能觉得这样操作有点low,他想的是我让它不创建新浏览器窗口不就行了,怎么办呢?找到相应的源码,重写一下(大佬到底还是大佬)。不过大佬已经给出完整代码,我们只需要复制下来用就行了。
既然只要通信的url和sessionID就能连接,那我能不能在使用selenium时指定这两个的值呢?可以看出通信url就是个本地地址加一个端口,我看了一下webdriver的代码发现()这个类有个port的参数,试了一下发现这个参数就是通信url的端口。既然端口可以指定,那sessionID呢?也许能,但我不会,没有相应的参数可以指定,也看不懂源码是在哪里生成的。