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呢?也許能,但我不會,沒有相應的參數可以指定,也看不懂源碼是在哪裏生成的。

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