selenium-webdriver(python) (十四) webdriver原理簡介

來源:互聯網
上載者:User

之前看乙醇視頻中提到,selenium 的ruby 實現有一個小後門,在代碼中加上$DEBUG=1 ,再運行指令碼的過程中,就可以看到用戶端請求的資訊與伺服器端返回的資料;覺得這個功能很強大,可以協助理解webdriver的運行原理。

後來查了半天,python並沒有提供這樣一個方便的後門,不過我們可以通過代理的方式獲得這些互動資訊;

一、需要安裝java 虛擬機器與selenium-server-standalone ,參考 《selenium + python自動化測試環境搭建》第7、8操作:

二、通過下面命令啟動服務:

C:\selenium>java -jar selenium-server-standalone-2.33.0.jar

在命令結尾加 >d:\log.txt 可以將命令資訊存入檔案,但資訊很少。

然後運行下面的自動化指令碼:

#coding = utf-8    import timefrom selenium import webdriverfrom selenium.webdriver.common.desired_capabilities import DesiredCapabilities    driver = webdriver.Remote(desired_capabilities=DesiredCapabilities.CHROME)driver.get("http://www.youdao.com")driver.find_element_by_name("q").send_keys("hello")driver.find_element_by_name("q").send_keys("key.ENTER")    driver.close()

webdriver原理:

1. WebDriver 啟動目標瀏覽器,並綁定到指定連接埠。該啟動的瀏覽器執行個體,做為web driver的remote server。

2. Client 端通過CommandExcuter 發送HTTPRequest 給remote server 的偵聽連接埠(通訊協定: the webriver wire protocol)

3. Remote server 需要依賴原生的瀏覽器組件(如:IEDriver.dll,chromedriver.exe),來轉化轉化瀏覽器的native調用。

查看命令提示字元下的作業記錄:

咋一看很亂,慢慢分析一下就發現很有意思!結合上面的指令碼分析

查看本欄目更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/extra/

---------------------------------------------------------------------------------------啟動代理進入監聽狀態C:\selenium>java -jar selenium-server-standalone-2.33.0.jar八月 22, 2013 10:19:48 上午 org.openqa.grid.selenium.GridLauncher mainINFO: Launching a standalone server10:19:48.734 INFO - Java: Oracle Corporation 23.21-b0110:19:48.734 INFO - OS: Windows XP 5.1 x8610:19:48.734 INFO - v2.33.0, with Core v2.33.0. Built from revision 4e90c9710:19:48.843 INFO - RemoteWebDriver instances should connect to: http://127.0.0.1:4444/wd/hub10:19:48.843 INFO - Version Jetty/5.1.x10:19:48.843 INFO - Started HttpContext[/selenium-server/driver,/selenium-server/driver]10:19:48.843 INFO - Started HttpContext[/selenium-server,/selenium-server]10:19:48.843 INFO - Started HttpContext[/,/]10:19:48.890 INFO - Started org.openqa.jetty.jetty.servlet.ServletHandler@176343e10:19:48.890 INFO - Started HttpContext[/wd,/wd]10:19:48.906 INFO - Started SocketListener on 0.0.0.0:444410:19:48.906 INFO - Started org.openqa.jetty.jetty.Server@388c74--------------------------------------------------------------------------------------    建立新session 10:20:38.593 INFO - Executing: [new session: {platform=ANY, javascriptEnabled=true, browserName=chrome, version=}] at URL: /session)10:20:38.593 INFO - Creating a new session for Capabilities [{platform=ANY, javascriptEnabled=true, browserName=chrome, version=}]       webdrivr通過GET方式發送請求[0.921][INFO]: received Webriver request: GET /status      向webdrver返迴響應,返回碼200表示成功[0.921][INFO]: sending Webriver response: 200 {   "sessionId": "",   "status": 0,   "value": {      "build": {         "version": "alpha"      },      "os": {         "arch": "x86",         "name": "Windows NT",         "version": "5.1 SP3"      }   }}    webdriver 再次以POST方式發送請求,並啟動瀏覽器相關資訊[0.984][INFO]: received Webriver request: POST /session {   "desiredCapabilities": {      "browserName": "chrome",      "javascriptEnabled": true,      "platform": "ANY",      "version": ""   }}[0.984][INFO]: Launching chrome: "C:\ocuments and Settings\Administrator\Local S
ettings\Application ata\Google\Chrome\Application\chrome.exe" --remote-debugging
-port=4223 --no-first-run --enable-logging --logging-level=1 --user-data-dir="C:
\OCUME~1\AMINI~1\LOCALS~1\Temp\scoped_dir1808_7550" --load-extension="C:\OCUME~1
\AMINI~1\LOCALS~1\Temp\scoped_dir1808_26821\internal" --ignore-certificate-error
s data:text/html;charset=utf-8,[1.773][INFO]: sending Webriver response: 303 webdriver再次以GET方法請求,這附加上了session的資訊[1.778][INFO]: received Webriver request: GET /session/32b33aa585ccbbf7ba78535882852af3 伺服器先對sesssionID進行解析,確認是selenium調用的以及要訪問的網址,[1.779][INFO]: sending Webriver response: 200 { "sessionId": "32b33aa585ccbbf7ba78535882852af3", "status": 0, "value": { "acceptSslCerts": true, "applicationCacheEnabled": false, "browserConnectionEnabled": false, "browserName": "chrome", "chrome": { "chromedriverVersion": "2.0" }, "cssSelectorsEnabled": true, "databaseEnabled": true, "handlesAlerts": true, "javascriptEnabled": true, "locationContextEnabled": true, "nativeEvents": true, "platform": "Windows NT", "rotatable": false, "takesScreenshot": true, "version": "27.0.1453.116", "webStorageEnabled": true }}10:20:40.640 INFO - Done: /session10:20:40.640 INFO - Executing: org.openqa.selenium.remote.server.handler.GetSessionCapabilities@14cf7a1 at URL: /session/ac5b2c71-5b1a-469e-814c-fdd09a2061fc)10:20:40.640 INFO - Done: /session/ac5b2c71-5b1a-469e-814c-fdd09a2061fc10:20:40.656 INFO - Executing: [get: http://www.youdao.com] at URL: /session/ac5b2c71-5b1a-469e-814c-fdd09a2061fc/url) webdriver正試向伺服器請求youdao網站[1.820][INFO]: received Webriver request: POST /session/32b33aa585ccbbf7ba78535882852af3/url { "url": "http://www.youdao.com"}[1.822][INFO]: waiting for pending navigations...[1.829][INFO]: done waiting for pending navigations[2.073][INFO]: waiting for pending navigations...[2.900][INFO]: done waiting for pending navigations 獲得伺服器資料的應答[2.900][INFO]: sending Webriver response: 200 { "sessionId": "32b33aa585ccbbf7ba78535882852af3", "status": 0, "value": null}10:20:41.734 INFO - Done: /session/ac5b2c71-5b1a-469e-814c-fdd09a2061fc/url--------------------------------------------------------------------------------------下面接著發送定位輸入框的資訊10:20:41.734 INFO - Executing: [find element: By.name: q] at URL: /session/ac5b2c71-5b1a-469e-814c-fdd09a2061fc/element)[2.905][INFO]: received Webriver request: POST /session/32b33aa585ccbbf7ba78535882852af3/element { "using": "name", "value": "q"}[2.905][INFO]: waiting for pending navigations...[2.905][INFO]: done waiting for pending navigations[2.922][INFO]: waiting for pending navigations...[2.922][INFO]: done waiting for pending navigations 得到伺服器應答[2.922][INFO]: sending Webriver response: 200 { "sessionId": "32b33aa585ccbbf7ba78535882852af3", "status": 0, "value": { "ELEMENT": "0.19427558477036655:1" }}10:20:41.765 INFO - Done: /session/ac5b2c71-5b1a-469e-814c-fdd09a2061fc/element10:20:41.765 INFO - Executing: [send keys: 0 org.openqa.selenium.support.events.EventFiringWebDriver$EventFiringWebElement@a8215ba9, [h, e, l, l, o]] at URL: /session/ac5b2c71-5b1a-469e-814c-fdd09a2061fc/element/0/value) 向定位到的輸入框寫入hello[2.936][INFO]: received Webriver request: POST /session/32b33aa585ccbbf7ba78535882852af3/element/0.19427558477036655:1/value { "id": "0.19427558477036655:1", "value": [ "h", "e", "l", "l", "o" ]}[2.936][INFO]: waiting for pending navigations...[2.936][INFO]: done waiting for pending navigations[3.002][INFO]: waiting for pending navigations...[3.002][INFO]: done waiting for pending navigations[3.002][INFO]: sending Webriver response: 200 { "sessionId": "32b33aa585ccbbf7ba78535882852af3", "status": 0, "value": null}10:20:41.843 INFO - Done: /session/ac5b2c71-5b1a-469e-814c-fdd09a2061fc/element/0/value 再次發送定位輸入框的請求10:20:41.843 INFO - Executing: [find element: By.name: q] at URL: /session/ac5b2c71-5b1a-469e-814c-fdd09a2061fc/element)[3.006][INFO]: received Webriver request: POST /session/32b33aa585ccbbf7ba78535882852af3/element { "using": "name", "value": "q"}[3.006][INFO]: waiting for pending navigations...[3.006][INFO]: done waiting for pending navigations[3.016][INFO]: waiting for pending navigations...[3.016][INFO]: done waiting for pending navigations[3.016][INFO]: sending Webriver response: 200 { "sessionId": "32b33aa585ccbbf7ba78535882852af3", "status": 0, "value": { "ELEMENT": "0.19427558477036655:1" }}10:20:41.859 INFO - Done: /session/ac5b2c71-5b1a-469e-814c-fdd09a2061fc/element10:20:41.859 INFO - Executing: [send keys: 0 org.openqa.selenium.support.events.EventFiringWebDriver$EventFiringWebElement@a8215ba9, [k, e, y, ., E, N, T, E, R]] at URL: /session/ac5b2c71-5b1a-469e-814c-fdd09a2061fc/element/0/value) 對定位的到的輸入框發送斷行符號(ENTER)事件請求[3.021][INFO]: received Webriver request: POST /session/32b33aa585ccbbf7ba78535882852af3/element/0.19427558477036655:1/value { "id": "0.19427558477036655:1", "value": [ "k", "e", "y", ".", "E", "N", "T", "E", "R" ]}[3.021][INFO]: waiting for pending navigations...[3.021][INFO]: done waiting for pending navigations[3.064][INFO]: waiting for pending navigations...[3.064][INFO]: done waiting for pending navigations[3.064][INFO]: sending Webriver response: 200 { "sessionId": "32b33aa585ccbbf7ba78535882852af3", "status": 0, "value": null}10:20:41.906 INFO - Done: /session/ac5b2c71-5b1a-469e-814c-fdd09a2061fc/element/0/value10:20:41.906 INFO - Executing: [close window] at URL: /session/ac5b2c71-5b1a-469e-814c-fdd09a2061fc/window)[3.068][INFO]: received Webriver request: ELETE /session/32b33aa585ccbbf7ba78535882852af3/window[WARNING:chrome_desktop_impl.cc(88)] chrome detaches, user should take care of directory:C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\scoped_dir1808_7550 and C:\DOCUME~1\
ADMINI~1\LOCALS~1\Temp\scoped_dir1808_26821[5.318][INFO]: sending Webriver response: 200 { "sessionId": "32b33aa585ccbbf7ba78535882852af3", "status": 0, "value": null}10:20:44.156 INFO - Done: /session/ac5b2c71-5b1a-469e-814c-fdd09a2061fc/window

request 請求 / response 應答

一次請求會對應一次應答

POST/GET  是請求(request)兩種類型;關於兩種請求方式的類別參考其它資料

200 、203 是 HTTP請求返回的狀態代碼,200表示成功;

sessionid :每一個訪問伺服器的用戶端,都要先得到伺服器端分配的一個sessionid ,就像通行證一樣,只有得到sessionid的用戶端才能向伺服器請求想要的資料。

其它還包括作業系統版本,瀏覽器類型、URL、字元類型等非常詳細的記錄。熟悉HTTP ,瞭解TCP 的三向交握四次揮手,相信你對瀏覽器的互動與webdriver原理會有更深入的認識。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.