1. 程式人生 > >Selenium RemoteWebDriver 利用CDP修改User-Agent

Selenium RemoteWebDriver 利用CDP修改User-Agent

地球人都知道,如果使用`selenium`時要修改`user-agent`可以在啟動瀏覽器時新增配置項,如`chromeOptions.addArguments("user-agent=xxx");`。但是如何在每次請求的時候動態更改`user-agent`呢? 經過我的不懈努力,終於在網上找到一個相關的資訊[使用python3和selenium4修改chrome的user-agent](https://stackoverflow.com/questions/61414081/rotating-user-agent-using-python3-and-selenium-4-chrome)。 這裡面提到了使用`driver.execute_cdp_cmd`來切換,這讓我瞭解了一下cdp命令。簡單的來說,cdp命令時chrome支援的一種基於websocket的協議,通過這個協議可以與瀏覽器核心通訊。平常使用的F12瀏覽器開發工具就是基於cdp的。cpd命令可以實現的功能很多,可以參考[Chrome DevTools Protocol](https://chromedevtools.github.io/devtools-protocol/)。再這裡面我找到了一個[`Network.setUserAgentOverride`](https://chromedevtools.github.io/devtools-protocol/tot/Network/#method-setUserAgentOverride)命令可以修改請求user-agent。 命令的引數如下: ![](https://img-blog.csdnimg.cn/20200522234009405.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lhbmdfd2VuX3d1,size_16,color_FFFFFF,t_70) 但是,在我的專案中目前使用的`selenium-java`的版本是`3.141.59`,這個版本還沒用提供對於cdp命令的支援,前面資訊中提到了是在selenium4中使用使用的cdp命令。於是我又去maven倉庫搜尋有沒有selenium4的jar包可以用。 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200522234402790.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lhbmdfd2VuX3d1,size_16,color_FFFFFF,t_70) 這裡面已經有5個alpha測試的版本了,雖然還不是穩定版本,但是為了實現新功能先試一試,在maven中新增依賴: ``` ``` 然後嘗試呼叫`ChromeDriver`的`executeCdpCommand`方法 ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200522234730961.png) 可以看到,第一個引數是`commandName`,對於修改user-agent的需求,這個地方應該填寫`Network.setUserAgentOverride`,後面是引數的鍵值對,現在只需要填寫`userAgent`就可以了,其他都是不需要的可選引數。 一般情況下,問題到這裡就解決了,但是在我的專案中卻沒有這麼簡單。因為各種原因,我的專案中使用的是Selenium-Server來提供瀏覽器環境的,也就是說,建立的都是RemoteWebDriver,雖然ChromeDriver是繼承自RemoteWebDriver的,但是cdp命令是chrome瀏覽器獨有的, 因此RemoteWebDriver也就沒有提供相關的支援了。那麼如何在確定RemoteWebDriver呼叫chrome瀏覽器的情況下提供cpd命令的支援呢?為了實現這個功能還是費了一些時間,因此在這裡把過程記錄下來。 首先看一下ChromeWebDriver是如何實現cdp命令的: ```java pu