python中webdriver_浅谈python中selenium库调动webdriver驱动浏览器的实现原理
最近學(xué)web自動(dòng)化時(shí)用到selenium庫,感覺很神奇,遂琢磨了一下,寫了點(diǎn)心得。
當(dāng)我們輸入以下三行代碼并執(zhí)行時(shí),會(huì)發(fā)現(xiàn)新打開了一個(gè)瀏覽器窗口并訪問了百度首頁,然而這是怎么做到的呢?
1 from selenium importwebdriver2 driver =webdriver.Chrome()3 driver.get('http://www.baidu.com')
首先我們來看一下selenium庫的結(jié)構(gòu):
很顯然,selenium就是一個(gè)軟件包,里面有兩個(gè)一級(jí)子包,common和webdriver。導(dǎo)入webdriver后,webdriver.Chrome()中的Chrome又是什么呢?
原來是來自二級(jí)子包c(diǎn)hrome下的webdriver模塊里的WebDriver類,所以driver=webdriver.Chrome()中的driver是一個(gè)WebDriver類的實(shí)例化對(duì)象。我們來看看這個(gè)類:
這個(gè)類是干嘛的呢?原來它是控制谷歌瀏覽器驅(qū)動(dòng)去驅(qū)動(dòng)瀏覽器的,但是仔細(xì)一找,也沒看到它里面有g(shù)et方法呀,哦,它繼承自RemoteWebDriver類,也就是二級(jí)子包remote下的webdriver模塊里的WebDriver類,呵呵,這還真是個(gè)高頻詞匯啊!get方法應(yīng)該就在這里面,去找一下:
果然,get調(diào)用上面的execute方法,傳參,發(fā)現(xiàn)execute又調(diào)用了command_executor.execute方法:
繼續(xù)查看,發(fā)現(xiàn)command_executor.execute方法是remote_connection.py這個(gè)模塊里面的RemoteConnection類下面的,
看這個(gè)類注釋,連接到遠(yuǎn)程瀏覽器驅(qū)動(dòng)服務(wù),很顯然,瀏覽器驅(qū)動(dòng)是服務(wù)端,selenium是客戶端。在下面找到execute方法:
給遠(yuǎn)程服務(wù)端發(fā)命令command,又將命令傳給下面的_request方法,發(fā)送HTTP請(qǐng)求給遠(yuǎn)程服務(wù)端,即瀏覽器驅(qū)動(dòng),這里出現(xiàn)了大家熟悉的請(qǐng)求方法get或者post,請(qǐng)求url,請(qǐng)求體,再往上看command:
原來發(fā)的是post請(qǐng)求,這里使用的是WebDriver wire protocol協(xié)議,即JsonWireProtocol,body部分是這個(gè)協(xié)議規(guī)定的JSON格式的字符串。
總的來說,過程還是很復(fù)雜的,至少對(duì)于我來說。
補(bǔ)充:對(duì)于每一條Selenium腳本,一個(gè)http請(qǐng)求會(huì)被創(chuàng)建并且發(fā)送給瀏覽器的驅(qū)動(dòng),瀏覽器驅(qū)動(dòng)中包含了一個(gè)HTTP Server,用來接收這些http請(qǐng)求,HTTP Server接收到請(qǐng)求后根據(jù)請(qǐng)求來具體操控對(duì)應(yīng)的瀏覽器,瀏覽器執(zhí)行具體的測試步驟,瀏覽器將步驟執(zhí)行結(jié)果返回給HTTP Server,HTTP Server又將結(jié)果返回給Selenium的腳本,如果是錯(cuò)誤的http代碼我們就會(huì)在控制臺(tái)看到對(duì)應(yīng)的報(bào)錯(cuò)信息。
總結(jié)
以上是生活随笔為你收集整理的python中webdriver_浅谈python中selenium库调动webdriver驱动浏览器的实现原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wpf listbox绑定不跟新_你知道
- 下一篇: wpf怎么让grid表格中元素显示到最顶