<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    qileilove

    blog已經轉移至github,大家請訪問 http://qaseven.github.io/

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

     之前看乙醇視頻中提到,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 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 啟動目標瀏覽器,并綁定到指定端口。該啟動的瀏覽器實例,做為web driver的remote server

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

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

     查看命令提示符下的運行日志:

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

    ---------------------------------------------------------------------------------------
    啟動代理進入監聽狀態
    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
    --------------------------------------------------------------------------------------

    創建新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方式發送請求
    [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/32b33aa585ccbbf7ba7853588
    2852af3

    服務器先對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: /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正試向服務器請求youdao網站
    [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

    獲得服務器數據的應答
    [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/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

    得到服務器應答
    [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)

    向定位到的輸入框寫入hello
    [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

    再次發送定位輸入框的請求
    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)

    對定位的到的輸入框發送回車(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 應答

      一次請求會對應一次應答

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

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

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

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

    相關文章:

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

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

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

    導航

    統計

    常用鏈接

    留言簿(55)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 中文字幕免费观看视频| 精品视频在线免费观看| a一级毛片免费高清在线| 337p日本欧洲亚洲大胆裸体艺术| 免费在线中文日本| 亚洲乱人伦中文字幕无码| 中文字幕亚洲电影| 一区二区免费国产在线观看| 免费h黄肉动漫在线观看| 国产精品偷伦视频观看免费 | 国产99在线|亚洲| 亚洲国产a级视频| **毛片免费观看久久精品| 久久亚洲AV无码精品色午夜| 日本免费电影一区| 人人揉揉香蕉大免费不卡| 亚洲精品无码专区久久| 亚洲精品免费在线观看| 久久国产精品成人片免费| 亚洲成人免费网站| 在线免费观看毛片网站| 全黄大全大色全免费大片| 亚洲另类无码专区首页| 亚洲成在人天堂在线| 无码精品A∨在线观看免费| 国产精品成人69XXX免费视频| 亚洲宅男精品一区在线观看| 国产亚洲婷婷香蕉久久精品| 99蜜桃在线观看免费视频网站| 亚洲av无码一区二区三区天堂| 日木av无码专区亚洲av毛片| 亚洲精品无码久久久| 成人免费无毒在线观看网站| 成年网站免费入口在线观看| 亚洲看片无码在线视频| 亚洲成片观看四虎永久| 西西大胆无码视频免费| 一级特黄aa毛片免费观看| 亚洲AV无码AV吞精久久| 亚洲国产成a人v在线| 亚洲国产综合专区在线电影|