這期內(nèi)容當中小編將會給大家?guī)碛嘘P(guān)如何正確移除Selenium中的,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
成都創(chuàng)新互聯(lián)專注于企業(yè)網(wǎng)絡(luò)營銷推廣、網(wǎng)站重做改版、格爾木網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、H5技術(shù)、商城網(wǎng)站定制開發(fā)、集團公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)公司、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為格爾木等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
下面將介紹了能夠正確從Selenium啟動的Chrome瀏覽器中移除window.navigator.webdriver
的方法。
后來時過境遷,Chrome升級了版本,導致當時的方法已經(jīng)失效。如下圖所示:
針對最新版本的Chrome,我們應(yīng)該如何正確隱藏這個參數(shù)呢?
在那篇文章里面,我罵了一種掩耳盜鈴的方式:
打開網(wǎng)頁,然后通過執(zhí)行如下 JavaScript 語句來隱藏window.navigator.webdriver
的值:
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
我罵了這種方式為掩耳盜鈴,是因為他們是在網(wǎng)頁已經(jīng)加載完畢以后才運行這段 JavaScript 代碼的,可此時網(wǎng)站自身的 js 程序早就已經(jīng)通過讀取window.navigator.webdriver
知道你現(xiàn)在使用模擬瀏覽器,你隱藏了又有什么用呢?
所以即使要執(zhí)行這段 JavaScript 語句,也應(yīng)該是在瀏覽器運行網(wǎng)站自帶的所有 JavaScript 之前。
這也就是我們現(xiàn)在的方案。
可能有讀者會認為,是不是通過寫 Chrome 瀏覽器的插件,讓插件里面的 JavaScript 語句在網(wǎng)站頁面剛剛打開,還沒有運行自帶的 JavaScript 之前運行。
這種方式雖然可以解決問題,但稍顯麻煩,我們今天的方法非常簡單。就是使用 Google 的Chrome Devtools-Protocol(Chrome 開發(fā)工具協(xié)議)
簡稱CDP
。
我們打開 CPD 的官方文檔[1],可以看到如下的命令:
?在每個Frame 剛剛打開,還沒有運行 Frame 的腳本前,運行給定的腳本。
”
通過這個命令,我們可以給定一段 JavaScript 代碼,讓 Chrome 剛剛打開每一個頁面,還沒有運行網(wǎng)站自帶的 JavaScript 代碼時,就先執(zhí)行我們給定的這段代碼。
那么如何在 Selenium 中調(diào)用 CDP 的命令呢?實際上非常簡單,我們使用driver.execute_cdp_cmd
。根據(jù) Selenium 的官方文檔[2],傳入需要調(diào)用的 CDP 命令和參數(shù)即可:
于是我們可以寫出如下代碼:
from selenium.webdriver import Chrome
driver = Chrome('./chromedriver')
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
"""
})
driver.get('http://exercise.kingname.info')
運行效果如下圖所示:
完美隱藏window.navigator.webdriver
。并且,關(guān)鍵語句:
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
"""
})
只需要執(zhí)行一次,之后只要你不關(guān)閉這個driver
開啟的窗口,無論你打開多少個網(wǎng)址,他都會自動提前在網(wǎng)站自帶的所有 js 之前執(zhí)行這個語句,隱藏window.navigator.webdriver
。
如果有人運行上面的代碼,出現(xiàn)如下報錯:
那么請升級你的 ChromeDriver。老版本的 Chrome + ChromeDriver 只能用以前的方法,不能用今天的方法。新版本的 Chrome + ChromeDriver 可以使用今天的方法,但不能用老方法。正應(yīng)了那句話:
?上帝給你關(guān)上一扇門的時候,悄悄為你開了一扇窗。
”
雖然使用以上代碼就可以達到目的了,不過為了實現(xiàn)更好的隱藏效果,大家也可以繼續(xù)加入兩個實驗選項:
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(options=options, executable_path='./chromedriver')
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
"""
})
driver.get('http://exercise.kingname.info')
上述就是小編為大家分享的如何正確移除Selenium中的了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。