使用ChromeDevTools協(xié)議編寫自己的ChromeDriver

ChromeDevTools協(xié)議簡稱CDP滑潘,它允許對Chromium垢乙,Chrome和其他基于Blink的瀏覽器進行檢測,探測语卤,調(diào)試和配置追逮。許多現(xiàn)有項目目前使用該協(xié)議。 Chrome的開發(fā)者工具就是使用此協(xié)議粹舵,該團隊也負責維護其API钮孵。Chrome瀏覽器可以遠程調(diào)試的方式啟動, 實際上在瀏覽器內(nèi)部啟動了一個采用DevTools的服務器, 任何符合該協(xié)議的websoket通訊都可以被Chrome響應,這樣你可以向Chrome發(fā)送命令, 執(zhí)行操作, 實現(xiàn)一些自動化瀏覽器的操作。大名鼎鼎的ChromeDriver就是通過 DevTools Protocol實現(xiàn)與chrome瀏覽器進行交互的眼滤。

CDP官方文檔如下:

https://chromedevtools.github.io/devtools-protocol/

協(xié)議基礎

當使用--remote-debugging-port= 0參數(shù)啟動Chromium/Chrome時巴席,它啟動Chrome DevTools協(xié)議服務器并將其WebSocket URL打印到STDERR。輸出看起來像這樣:DevTools listening on ws://127.0.0.1:36775/devtools/browser/a292f96c-7332-4ce8-82a9-7411f3bd280a

客戶端可以創(chuàng)建WebSocket以連接到該URL并開始發(fā)送CDP命令诅需。 ChromeDevTools協(xié)議主要基于JSONRPC:每個命令都是一個帶有id/方法和可選參數(shù)的JavaScript結構漾唉。我們可以用如下js代碼,通過websocket協(xié)議完成與瀏覽器的交互


此腳本通過DevTools協(xié)議發(fā)送Targets.setDiscoverTargets命令诱担。瀏覽器將首先為每個現(xiàn)有目標發(fā)出一個Target.targetCreated事件毡证,然后響應該命令:

connected!

Sending Target.setDiscoverTargets

{"method":"Target.targetCreated","params":{"targetInfo":{"targetId":"38555cfe-5ef3-44a5-a4e9-024ee6ebde5f","type":"browser","title":"","url":"","attached":true}}}

{"method":"Target.targetCreated","params":{"targetInfo":{"targetId":"52CA0FEA80FB0B98BCDB759E535B21E4","type":"page","title":"","url":"about:blank","attached":false,"browserContextId":"339D5F1CCABEFE8545E15F3C2FA5F505"}}}

{"id":1,"result":{}}

模擬chromedriver實現(xiàn)方案


環(huán)境搭建

從上面的例子中通過websocket與chrome直接交互實現(xiàn)是比較復雜的,因此各種主流語言都提供了類庫來簡化該過程蔫仙,詳細信息請參考:

https://github.com/ChromeDevTools/awesome-chrome-devtools#chrome-devtools-protocol



在這里我們使用python的pychrome 來實現(xiàn)與chrome的交互料睛,也可以理解我們自己開發(fā)了一個chromedriver!

Pychrome詳情請參考:https://github.com/fate0/pychrome

安裝pychrome

pip install -U pychrome

Selenium實現(xiàn)場景

實現(xiàn)場景:在百度輸入框中搜索selenium摇邦。

我們先回顧一下Selenium的代碼實現(xiàn)過程如下:

1.把chromedriver.exe放到系統(tǒng)環(huán)境變量中

2.編寫py代碼

from selenium import webdriver

import unittest

class UntitledTestCase(unittest.TestCase):

????? def setUp(self):

???? ? ? ?? self.driver = webdriver.Chrome()

???? ? ? ?? self.driver.implicitly_wait(30)

??? def test_untitled_test_case(self):

?????? ? ? ? driver =self.driver

??? ? ? ? ?? driver.get("https://www.baidu.com/")

??? ? ?????? driver.find_element_by_id("kw").clear()

?????? ? ? ? driver.find_element_by_id("kw").send_keys("selenium")

???????????? driver.find_element_by_id("su").click()

???? def tearDown(self):

????????????? self.driver.quit()


3.執(zhí)行自動化腳本

Selenium的原理如下:


從上圖可知恤煞,最后是通過chromedriver完成了和chrome瀏覽器的交互!

關于selenium的詳細原理分析可以參考文章:

Selenium原理精講

cdp實現(xiàn)場景

接下來我們通過cdp直接跟chrome瀏覽器的交互施籍,模擬chromedriver居扒,代碼如下:

import pychrome

browser = pychrome.Browser(

url="http://127.0.0.1:9222")

#打開一個新的瀏覽器tabtab = browser.new_tab()

tab.start()

tab.Network.enable()

#訪問baidu

tab.Page.navigate(url="https://www.baidu.com", _timeout=5)

tab.wait(5)

#在搜索框中輸入selenium

tab.Runtime.evaluate(expression='document.getElementById("kw").value="selenium"')

tab.wait(1)

#點擊‘百度一下’按鈕

tab.Runtime.evaluate(expression='document.getElementById("su").click()')

tab.wait(5)

tab.stop()

browser.close_tab(tab)

執(zhí)行代碼前,必須設置chrome屬性丑慎,如下圖所示:

接下來啟動chrome喜喂。

最后執(zhí)行py腳本,大家可以看到:

瀏覽器自動打開新的tab頁>在百度輸入框中搜索selenium>關閉tab頁這一過程竿裂!這也就是selenium操控瀏覽器的原理了玉吁!原創(chuàng)不易,如果文章幫到了你腻异,歡迎點贊轉發(fā)进副,讓更多的朋友受益!

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末悔常,一起剝皮案震驚了整個濱河市影斑,隨后出現(xiàn)的幾起案子给赞,更是在濱河造成了極大的恐慌,老刑警劉巖矫户,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件片迅,死亡現(xiàn)場離奇詭異,居然都是意外死亡皆辽,警方通過查閱死者的電腦和手機障涯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來膳汪,“玉大人唯蝶,你說我怎么就攤上這事∫潘裕” “怎么了粘我?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長痹换。 經(jīng)常有香客問我征字,道長,這世上最難降的妖魔是什么娇豫? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任匙姜,我火速辦了婚禮,結果婚禮上冯痢,老公的妹妹穿的比我還像新娘氮昧。我一直安慰自己,他們只是感情好浦楣,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布袖肥。 她就那樣靜靜地躺著,像睡著了一般振劳。 火紅的嫁衣襯著肌膚如雪椎组。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天历恐,我揣著相機與錄音寸癌,去河邊找鬼。 笑死弱贼,一個胖子當著我的面吹牛蒸苇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播哮洽,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼填渠,長吁一口氣:“原來是場噩夢啊……” “哼弦聂!你這毒婦竟也來了鸟辅?” 一聲冷哼從身側響起氛什,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎匪凉,沒想到半個月后枪眉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡再层,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年贸铜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片聂受。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡蒿秦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蛋济,到底是詐尸還是另有隱情棍鳖,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布碗旅,位于F島的核電站渡处,受9級特大地震影響,放射性物質發(fā)生泄漏祟辟。R本人自食惡果不足惜医瘫,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望旧困。 院中可真熱鬧醇份,春花似錦、人聲如沸吼具。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽馍悟。三九已至畔濒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間锣咒,已是汗流浹背侵状。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留毅整,地道東北人趣兄。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像悼嫉,于是被迫代替她去往敵國和親艇潭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348