qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請?jiān)L問 http://qaseven.github.io/

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

           之前看乙醇視頻中提到,selenium 的ruby 實(shí)現(xiàn)有一個(gè)小后門,在代碼中加上$DEBUG=1 ,再運(yùn)行腳本的過程中,就可以看到客戶端請求的信息與服務(wù)器端返回的數(shù)據(jù);覺得這個(gè)功能很強(qiáng)大,可以幫助理解webdriver的運(yùn)行原理。

            后來查了半天,python并沒有提供這樣一個(gè)方便的后門,不過我們可以通過代理的方式獲得這些交互信息;

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

            二、通過下面命令啟動服務(wù):

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

            在命令結(jié)尾加 >d:\log.txt 可以將命令信息存入文件,但信息很少。

            然后運(yùn)行下面的自動化腳本:

          #coding = utf-8

          import time
          from selenium import webdriver
          from 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 啟動目標(biāo)瀏覽器,并綁定到指定端口。該啟動的瀏覽器實(shí)例,做為web driver的remote server

            2. Client 端通過CommandExcuter 發(fā)送HTTPRequest 給remote server 的偵聽端口(通信協(xié)議: the webriver wire protocol)

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

           查看命令提示符下的運(yùn)行日志:

            咋一看很亂,慢慢分析一下就發(fā)現(xiàn)很有意思!結(jié)合上面的腳本分析

          ---------------------------------------------------------------------------------------
          啟動代理進(jìn)入監(jiān)聽狀態(tài)
          C:\selenium>java -jar selenium-server-standalone-2.33.0.jar
          八月 22, 2013 10:19:48 上午 org.openqa.grid.selenium.GridLauncher main
          INFO: Launching a standalone server
          10:19:48.734 INFO - Java: Oracle Corporation 23.21-b01
          10:19:48.734 INFO - OS: Windows XP 5.1 x86
          10:19:48.734 INFO - v2.33.0, with Core v2.33.0. Built from revision 4e90c97
          10:19:48.843 INFO - RemoteWebDriver instances should connect to: http://127.0.0.
          1:4444/wd/hub
          10:19:48.843 INFO - Version Jetty/5.1.x
          10: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@176343
          e
          10:19:48.890 INFO - Started HttpContext[/wd,/wd]
          10:19:48.906 INFO - Started SocketListener on 0.0.0.0:4444
          10:19:48.906 INFO - Started org.openqa.jetty.jetty.Server@388c74
          --------------------------------------------------------------------------------------

          創(chuàng)建新session 
          10:20:38.593 INFO - Executing: [new session: {platform=ANY, javascriptEnabled=tr
          ue, browserName=chrome, version=}] at URL: /session)
          10:20:38.593 INFO - Creating a new session for Capabilities [{platform=ANY, java
          scriptEnabled=true, browserName=chrome, version=}]  

          webdrivr通過GET方式發(fā)送請求
          [0.921][INFO]: received Webriver request: GET /status 

          向webdrver返回響應(yīng),返回碼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方式發(fā)送請求,并啟動瀏覽器相關(guān)信息
          [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/32b33aa585ccbbf7ba7853588
          2852af3

          服務(wù)器先對sesssionID進(jìn)行解析,確認(rèn)是selenium調(diào)用的以及要訪問的網(wǎng)址,
          [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: /session
          10:20:40.640 INFO - Executing: org.openqa.selenium.remote.server.handler.GetSess
          ionCapabilities@14cf7a1 at URL: /session/ac5b2c71-5b1a-469e-814c-fdd09a2061fc)
          10:20:40.640 INFO - Done: /session/ac5b2c71-5b1a-469e-814c-fdd09a2061fc
          10:20:40.656 INFO - Executing: [get: http://www.youdao.com] at URL: /session/ac5
          b2c71-5b1a-469e-814c-fdd09a2061fc/url)

          webdriver正試向服務(wù)器請求youdao網(wǎng)站
          [1.820][INFO]: received Webriver request: POST /session/32b33aa585ccbbf7ba785358
          82852af3/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

          獲得服務(wù)器數(shù)據(jù)的應(yīng)答
          [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
          --------------------------------------------------------------------------------------
          下面接著發(fā)送定位輸入框的信息
          10:20:41.734 INFO - Executing: [find element: By.name: q] at URL: /session/ac5b2
          c71-5b1a-469e-814c-fdd09a2061fc/element)
          [2.905][INFO]: received Webriver request: POST /session/32b33aa585ccbbf7ba785358
          82852af3/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

          得到服務(wù)器應(yīng)答
          [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/element
          10:20:41.765 INFO - Executing: [send keys: 0 org.openqa.selenium.support.events.
          EventFiringWebDriver$EventFiringWebElement@a8215ba9, [h, e, l, l, o]] at URL: /s
          ession/ac5b2c71-5b1a-469e-814c-fdd09a2061fc/element/0/value)

          向定位到的輸入框?qū)懭雋ello
          [2.936][INFO]: received Webriver request: POST /session/32b33aa585ccbbf7ba785358
          82852af3/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

          再次發(fā)送定位輸入框的請求
          10:20:41.843 INFO - Executing: [find element: By.name: q] at URL: /session/ac5b2
          c71-5b1a-469e-814c-fdd09a2061fc/element)
          [3.006][INFO]: received Webriver request: POST /session/32b33aa585ccbbf7ba785358
          82852af3/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/element
          10: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)

          對定位的到的輸入框發(fā)送回車(ENTER)事件請求
          [3.021][INFO]: received Webriver request: POST /session/32b33aa585ccbbf7ba785358
          82852af3/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/value
          10:20:41.906 INFO - Executing: [close window] at URL: /session/ac5b2c71-5b1a-469
          e-814c-fdd09a2061fc/window)
          [3.068][INFO]: received Webriver request: ELETE /session/32b33aa585ccbbf7ba78535
          882852af3/window
          [WARNING:chrome_desktop_impl.cc(88)] chrome detaches, user should take care of d
          irectory: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 應(yīng)答

            一次請求會對應(yīng)一次應(yīng)答

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

            200 、203 是 HTTP請求返回的狀態(tài)碼,200表示成功;

            sessionid :每一個(gè)訪問服務(wù)器的客戶端,都要先得到服務(wù)器端分配的一個(gè)sessionid ,就像通行證一樣,只有得到sessionid的客戶端才能向服務(wù)器請求想要的數(shù)據(jù)。

            其它還包括操作系統(tǒng)版本,瀏覽器類型、URL、字符類型等非常詳細(xì)的記錄。熟悉HTTP ,了解TCP 的三次握手四次揮手,相信你對瀏覽器的交互與webdriver原理會有更深入的認(rèn)識。

          相關(guān)文章:

          selenium-webdriver(python) (十三) -- cookie處理

          posted on 2013-09-13 11:47 順其自然EVO 閱讀(779) 評論(0)  編輯  收藏 所屬分類: selenium and watir webdrivers 自動化測試學(xué)習(xí)

          <2013年9月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 诸暨市| 吴忠市| 荔浦县| SHOW| 阳春市| 探索| 冕宁县| 拜泉县| 越西县| 金寨县| 达孜县| 石景山区| 南木林县| 宁海县| 蓝山县| 井陉县| 商河县| 芦山县| 巴楚县| 乌拉特后旗| 冀州市| 思茅市| 华坪县| 洛宁县| 南城县| 东乌珠穆沁旗| 民权县| 青州市| 阿荣旗| 岳阳县| 建德市| 涿州市| 周宁县| 定兴县| 东兰县| 孝义市| 筠连县| 太原市| 漳州市| 沾化县| 德令哈市|