從python角度解析selenium原理


 

1、selenium工作流程

2、selenium工作原理

(1)客戶端和服務端之間實際是通過http協議進行通信,服務端的接口文檔可參考:
(2)客戶端按照服務端接口要求傳入請求方式、請求url和請求數據,然后發送http請求,服務端收到請求后驅動瀏覽器執行命令;
(3)selenium實際已封裝好各種操作接口的請求函數,用戶只需通過指定的方法傳入數據即可,
         如get、click、find_element實際都是封裝了整個http請求過程的方法;
    即測試人員僅需根據功能需求調用對應的方法並傳參即可,最終由selenium組裝請求信息后發送請求;
(4)可見,完全可以跳過selenium,自己通過requests模塊構建請求信息發送給驅動程序,從而驅動瀏覽器執行相關操作。

3、從selenium源碼角度剖析selenium原理

(1)先說明一下

以下例子,以python、chrome驅動程序、chrome瀏覽器展開說明。

(2)通過selenium實現工作流

 1  1 # 啟動chrome瀏覽器
 2  2 driver = webdriver.Chrome()
 3  3 # 訪問百度網站
 4  4 driver.get("http://www.baidu.com")
 5  5 # 查找輸入框元素
 6  6 ele = driver.find_element_by_id("kw")
 7  7 # 在輸入框中輸入“selenium”
 8  8 ele.send_keys("selenium")
 9  9 # 查找百度一下按鈕
10 10 ele = driver.find_element_by_id("su")
11 11 # 點擊百度一下按鈕
12 12 ele.click()

(3)selenium源碼解析

① driver = webdriver.Chrome()
啟動chromedriver驅動程序,啟動后可通過http://ip:port訪問驅動程序
通過execute方法,構建“創建新會話”接口的請求信息,並發送http請求,返回會話id:
請求方式:POST
請求地址:http://localhost:post/session
請求數據:data = {"desiredCapabilities":{
          "browserName": "chrome",
          "version":"85.0.4183.83",
          "platform":"WINDOWS"}
        }
 
② driver.get("http://www.baidu.com")
通過execute方法,按get命令的接口信息構建http請求信息,並發送http請求:
請求方式:POST
請求地址:http://localhost:post/session/$sessionId/url(sessionId為會話id,從①中獲取)
請求數據:{"url": "http://www.baidu.com"}
 
③ driver.find_element_by_id("kw")
通過execute方法,按find_element_by_id命令的接口信息構建http請求信息,並發送http請求:
請求方式:POST
請求地址:http://localhost:post/session/$sessionId/element(sessionId為會話id,從①中獲取)
請求數據:{"using":"id","value":"kw"}
  
④ ele.send_keys("selenium")
通過execute方法,按send_keys命令的接口信息構建http請求信息,並發送http請求:
請求方式:POST
請求地址:http://localhost:post/session/$sessionId/element/$id/value(sessionId為會話id,從①中獲取,id為元素id,從③獲取)
請求數據:{"value": ["selenium"]}
  
⑤ ele.click()
通過execute方法,按click命令的接口信息構建http請求信息,並發送http請求:
請求方式:POST
請求地址:http://localhost:post/session/$sessionId/element/$id/click(sessionId為會話id,從①中獲取,id為元素id,從③獲取)
請求數據:無
 
 

4、通過requests模塊實操驗證selenium實現原理

(1)代碼實現

 
                
 1  1 # TODO 訪問域名
 2  2 base_url = "http://localhost:9515"
 3  3 
 4  4 # TODO 創建會話
 5  5 url = base_url + "/session"
 6  6 data = {
 7  7         "desiredCapabilities":{
 8  8                 "browserName": "chrome",
 9  9                 "version":"85.0.4183.83",
10 10                 "platform":"WINDOWS"
11 11         }
12 12 }
13 13 res = request("POST",url,json=data)
14 14 session_id = res.json()["sessionId"]    # 返回會話id
15 15 
16 16 sleep(2)
17 17 
18 18 # TODO 發送get命令 - 訪問某個網站
19 19 url = base_url + "/session/{}/url".format(session_id)
20 20 data = {
21 21     "url": "http://www.baidu.com"
22 22 }
23 23 res = request("POST",url,json=data)
24 24 
25 25 # TODO 發送find_element命令 - 查找元素
26 26 url = base_url + "/session/{}/element".format(session_id)
27 27 data = {
28 28     "using":"id",
29 29     "value":"kw"
30 30 }
31 31 res = request("POST",url,json=data)
32 32 ele = jsonpath(res.json(),"$..ELEMENT")[0]      # 返回元素id
33 33 
34 34 # TODO 發送send_keys命令 - 輸入內容
35 35 url = base_url + "/session/{}/element/{}/value".format(session_id,ele)
36 36 data = {
37 37     "value": ["selenium"]
38 38 }
39 39 res = request("POST",url,json=data)
40 40 
41 41 # TODO 發送find_element命令 - 查找元素
42 42 url = base_url + "/session/{}/element".format(session_id)
43 43 data = {
44 44     "using":"id",
45 45     "value":"su"
46 46 }
47 47 res = request("POST",url,json=data)
48 48 ele = jsonpath(res.json(),"$..ELEMENT")[0]      # 返回元素id
49 49 
50 50 # TODO 發送click命令 - 元素點擊
51 51 url = base_url + "/session/{}/element/{}/click".format(session_id,ele)
52 52 res = request("POST",url)

(2)運行結果

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM