解決 Selenium 自動化中的常見疑難雜癥
這里記錄一些關(guān)于 Selenium
的常用操作和疑難雜癥。
有一些細(xì)節(jié)的知識點就不重復(fù)介紹了,因為之前的文章中都有!
如果對本文中的知識點有疑問的,可以先閱讀我以前分享的文章!
知識點????
模塊 | 鏈接 | 作用 |
---|---|---|
selenium | https://www.selenium.dev/zh-cn/documentation/ | 支持 web 瀏覽器自動化的一系列工具和庫的綜合項目 |
如果有看不懂的地方,可以結(jié)合我以前的文章一起看。
-
【Selenium】控制當(dāng)前已經(jīng)打開的 chrome瀏覽器窗口
-
【Selenium】控制當(dāng)前已經(jīng)打開的 chrome瀏覽器窗口(高級版)
-
Python模塊psutil:系統(tǒng)進(jìn)程管理與Selenium效率提升的完美結(jié)合
-
Selenium性能優(yōu)化:一文帶你快速上手!
TodoList:
- 使用
crx
擴展插件進(jìn)行代理修改(后續(xù)更新 - …
初始化webdriver
-
ChromeService 是一個Service類,負(fù)責(zé)啟動和停止
chromedriver
。這個進(jìn)程是運行自動化腳本的基礎(chǔ)。 -
webdriver-manager 可以自動下載和管理 WebDriver 二進(jìn)制文件,用于自動管理
webdriver
驅(qū)動
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
def init_driver(options=None) -> webdriver.Chrome:
"""
初始化瀏覽器驅(qū)動.
Args:
options(Options): chrome配置選項
Returns:
driver(WebDriver): 瀏覽器驅(qū)動對象
"""
return webdriver.Chrome(
service=ChromeService(ChromeDriverManager().install()),
options=options
)
使用代理
- 使用crx擴展插件進(jìn)行代理修改(后續(xù)更新
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
if __name__ == '__main__':
options = Options()
proxy = "http://127.0.0.1:9527"
options.add_argument(f'--proxy-server={proxy}')
driver = init_driver(options=options)
driver.get('https://www.bilibili.com/')
運行結(jié)果如下:
- 可以請下的看到,所有請求的
Remote Address
都是127.0.0.1:7890
指定 Chrome 瀏覽器端口
啟動瀏覽器
代碼貼心的給出多項selenium
優(yōu)化選項,根據(jù)需要來選擇~
import subprocess
def start_chrome(browser_path, commands_list=None) -> None:
"""
啟動瀏覽器。
Args:
browser_path(str): 瀏覽器安裝的路徑
commands_list(List[str]): 啟動瀏覽器的命令行參數(shù),默認(rèn)為None
Returns:
None
"""
commands = [browser_path]
commands.extend(commands_list)
# 啟動瀏覽器
subprocess.Popen(commands)
if __name__ == '__main__':
# 設(shè)置瀏覽器的路徑和啟動參數(shù)
path = r"C:\Program Files\Google\Chrome\Application\chrome.exe"
port = 9527
cmd_map = {
'指定瀏覽器配置': r'--user-data-dir=F:\selenium',
'指定遠(yuǎn)程調(diào)試端口': '--remote-debugging-port={}'.format(port),
# '無頭模式': '--headless',
# '無沙盒模式': '--no-sandbox',
# '指定頁面加載策略': '--no-sandbox',
# '禁用彈出攔': '--disable-popup-blocking',
# '禁用圖片加載': '--blink-settings=imagesEnabled=false',
# '禁用GPU硬件加速': '--disable-gpu',
# '禁用js': True,
}
start_chrome(path, list(cmd_map.values()))
連接瀏覽器
注意!這里
Selenium WebDriver
將附加到一個已經(jīng)運行的 Chrome 實例上,而不是啟動一個新的瀏覽器實例。這意味著 WebDriver 將使用現(xiàn)有瀏覽器實例的設(shè)置,包括網(wǎng)絡(luò)和代理配置。即無法使用上處的方法進(jìn)行指定代理。
具體步驟如下:
- 導(dǎo)入 Selenium 相關(guān)模塊。
- 創(chuàng)建 Chrome 瀏覽器的選項(Options)對象,并將調(diào)試端口設(shè)置為 “127.0.0.1:9527”,這意味著瀏覽器將連接到 Chrome 瀏覽器的開發(fā)者工具(DevTools)端口,以便進(jìn)行遠(yuǎn)程調(diào)試。
- 初始化 Chrome WebDriver,將上述選項傳遞給 WebDriver。
- 打開 Chrome 瀏覽器,并連接到指定的調(diào)試端口。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
if __name__ == '__main__':
options = Options()
options.add_experimental_option("debuggerAddress", "127.0.0.1:9527")
driver = webdriver.Chrome(options=options)
url = 'https://www.bilibili.com'
driver.get(url)
print(driver.title) # 嗶哩嗶哩 (゜-゜)つロ 干杯~-bilibili
無法連接指定端口 Chrome瀏覽器
在命令行中啟動 Chrome 瀏覽器時候,不要使用
--headless
?。?!會導(dǎo)致Selenium
無法連接。
問題復(fù)現(xiàn)
一般的,我們使用以下命令去指定chrome瀏覽器端口,--headless
可能是有意或無意添加的
[
"--remote-debugging-port=9527",
"--headless"
]
# 或者 命令行
chrome.exe --remote-debugging-port=9527 --user-data-dir="F:\selenium\AutomationProfile" --headless
這個時候,會發(fā)現(xiàn),沒有打開任何窗口。因為是無頭模式!??!
在命令行執(zhí)行 netstat -ano | findstr :9527
,如下圖所示:
現(xiàn)在你去訪問:http://127.0.0.1:9527/json/version,可以看到下圖所示:
- 這表明遠(yuǎn)程調(diào)試接口是開啟的
但如果我們使用以下代碼去連接端口為 9527
的瀏覽器,則會報錯?。?!
options.add_experimental_option("debuggerAddress", "127.0.0.1:9527")
driver = webdriver.Chrome(options=options)
如果沒有意外!則會拋出以下異常:
selenium.common.exceptions.WebDriverException: Message: unknown error: cannot connect to chrome at 127.0.0.1:9527
from unknown error: unable to discover open pages
這個問題其實是不應(yīng)該發(fā)生的?。?!
因為 無頭模式
可能改變了與調(diào)試接口的交互方式或者其他相關(guān)配置,從而影響到了 Selenium
的連接。
如何解決
殺死全部的9527端口的進(jìn)程,并注意在命令行中啟動 Chrome 瀏覽器時候,不要使用
--headless
。
這個命令的目的是終止在指定端口上運行的進(jìn)程,以便釋放端口并停止與之相關(guān)的應(yīng)用程序。請注意,使用 taskkill
命令會強制終止進(jìn)程,因此要小心使用,以免意外終止重要的進(jìn)程。
這個時候,我們需要在命令行執(zhí)行以下命令,作用是終止在端口 9527 上運行的進(jìn)程。(詳細(xì)解釋看下面)
-
netstat -ano | findstr :9527
:這部分命令用于查找在端口 9527 上運行的進(jìn)程的 PID。netstat
列出了所有網(wǎng)絡(luò)連接,而findstr :9527
過濾出包含端口 9527 的行,顯示它們的 PID。 -
for /f "tokens=5" %a in (...) do ...
:for
命令用于處理上述命令的輸出。它將提取netstat
輸出中的 PID,并將其存儲在%a
變量中。 -
taskkill /F /PID %a
:一旦 PID 被提取并存儲在%a
中,taskkill
命令將使用這個 PID 終止相關(guān)進(jìn)程。
for /f "tokens=5" %a in ('netstat -ano ^| findstr :9527') do taskkill /F /PID %a
kill PID
for /f "tokens=5" %a in ('netstat -ano ^| findstr :9527') do taskkill /F /PID %a
這段命令是一個用于在 Windows 命令提示符中終止在特定端口(9527)上運行的進(jìn)程的復(fù)合命令。下面是這個命令的解釋:
-
for /f "tokens=5" %a in ('netstat -ano ^| findstr :9527') do ...
:這部分命令使用for
循環(huán)來處理輸出結(jié)果。它的作用是執(zhí)行以下操作:-
for /f
:這表示使用for
命令來進(jìn)行循環(huán)迭代。 -
"tokens=5"
:這指定了循環(huán)要提取的令牌(token),在這里我們提取第五個令牌。在這個上下文中,第五個令牌是netstat
輸出中的進(jìn)程標(biāo)識符(PID)。 -
%a
:這是一個變量,用于存儲從netstat
命令輸出中提取的 PID。
-
-
('netstat -ano ^| findstr :9527')
:這部分是在for
命令內(nèi)部的命令,它會產(chǎn)生一系列數(shù)字,這些數(shù)字代表在端口 9527 上運行的進(jìn)程的 PID。它的工作步驟如下:-
netstat -ano
:這部分執(zhí)行netstat
命令,用于列出所有活動網(wǎng)絡(luò)連接及其相關(guān)信息。-ano
標(biāo)志告訴netstat
顯示所有連接的詳細(xì)信息,并顯示每個連接的 PID。 -
^|
:這是一個管道符號|
,用于將netstat
的輸出傳遞給下一個命令,即findstr
。 -
findstr :9527
:這部分命令用于過濾netstat
輸出,只保留包含端口號9527
的行,這些行包括了我們關(guān)心的進(jìn)程信息。
-
-
taskkill /F /PID %a
:一旦for
循環(huán)提取了netstat
輸出中的 PID(存儲在%a
中),這部分命令使用taskkill
命令來終止這些進(jìn)程。具體地:-
taskkill
:這是用于終止進(jìn)程的命令。 -
/F
:這是taskkill
的標(biāo)志,表示要強制終止進(jìn)程,即無需用戶確認(rèn)。 -
/PID %a
:這是指定要終止的進(jìn)程的 PID,其中%a
包含了在for
循環(huán)中提取的 PID。
-
因此,整個命令的作用是找到所有在端口 9527 上運行的進(jìn)程的 PID,然后使用 taskkill
命令將它們終止掉。這可以幫助我們清除特定端口上的活動進(jìn)程。需要注意使用此命令,以免終止不必要的進(jìn)程。文章來源:http://www.zghlxwxcb.cn/news/detail-767090.html
未完待續(xù)
將持續(xù)更新,常見的Selenium的操作 和 疑難雜癥等!文章來源地址http://www.zghlxwxcb.cn/news/detail-767090.html
到了這里,關(guān)于Selenium 自動化高級操作與解決疑難雜癥,如無法連接、使用代理等的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!