Selenium底層原理
3天精通Postman接口測試,全套項目實戰教程!!
運行代碼,啟動瀏覽器后,webdriver會將瀏覽器綁定到特定的端口,作為webdriver的remote server(遠程服務端),而client(客戶端,也就是測試腳本,可以是Python或者Java代碼)會借助CommandExecutor創建sessionId,發送http請求給remote server,remote server收到http請求后,調用webdriver完成操作,并將http響應結果返回給client。
所以,本質上是調用http請求的過程,因此也就可以理解為什么可以使用Postman實現UI自動化測試。
Postman實現UI自動化測試
以上我們知道了Selenium的底層原理其實就是調用http請求的過程,那么我們要想調用接口就需要知道接口信息,包括請求方式、請求地址、請求參數、請求格式等。
這些接口信息,我們可以通過對源碼的分析得到。
運行chromedriver.exe
Selenium腳本:
from selenium import webdriver
driver = webdriver.Chrome()
執行上述代碼,程序會打開Chrome瀏覽器。(前提:已經正確配置了Chrome驅動和對應的版本)
那么,Selenium是如何實現這一過程的呢?
源碼分析:
D:\Python3\Lib\site-packages\selenium\webdriver\chrome\webdriver.py
我們可以看到它執行了一個cmd命令,這個命令主要是啟動chromedriver.exe瀏覽器驅動,我們每次執行腳本前,程序會自動幫我們啟動瀏覽器驅動。
由于我們跳過了代碼腳本,因此需要手動啟動瀏覽器驅動。
地址及端口號:127.0.0.1:9515
新建瀏覽器會話
D:\Python3\Lib\site-packages\selenium\webdriver\remote\webdriver.py
繼續查看源碼,這里有一行重要的代碼:
start_session()這個方法是向地址http://127.0.0.1:9515/session
發送了一個post請求,參數是JSON格式,然后返回一個特定的響應信息給程序,主要就是新建了一個sessionId。
接口信息:
url: /session
method: POST
content_type: application/json
請求參數:
{"capabilities": {"browserName": "chrome"}
}
調用接口:
訪問目標網站
Selenium腳本:
driver.get("https://www.baidu.com")
執行以上代碼,可以訪問目標網站。
源碼分析:
D:\Python3\Lib\site-packages\selenium\webdriver\remote\remote_connection.py
在RemoteConnection這個類中,定義了所有selenium操作需要的接口地址(這些接口地址全部封裝在瀏覽器驅動程序中)。
其中Command.GET: ("POST", "/session/$sessionId/url")
這個地址就是實現訪問一個網站的URL。
緊接著,可以看到主要是通過execute()方法調用_request()方法通過urllib3標準庫向服務器發送對應操作請求地址,進而實現瀏覽器各種操作。
而打開瀏覽器
和操作瀏覽器實現各種動作
是通過上一步新建瀏覽器會話返回的sessionId實現的關聯。你也會發現后面操作的各種接口地址中都存在一個$sessionId
,以達到能夠在同一個瀏覽器中做操作。
接口信息:
url: /session/$sessionId/url
method: POST
content_type: application/json
請求參數:
{"url": "目標網站地址"
}
調用接口:
窗口最大化
Selenium腳本:
driver.maximize_window()
源碼分析:
接口信息:
url: /session/$sessionId/window/maximize
method: POST
content_type: application/json
調用接口:
元素定位
Selenium腳本:
driver.find_element(By.XPATH, "//input[@id='kw']")
源碼分析:
接口信息:
url: /session/$sessionId/element
method: POST
content_type: application/json
請求參數:
{"using": "xpath", // 定位方式"value": "//input[@id='kw']" // 值
}
接口調用:
輸入文本
Selenium腳本:
driver.find_element(By.XPATH, '//input[@type="text"]').send_keys("測試蔡坨坨")
源碼分析:
接口信息:
url: /session/$sessionId/element/$id/value
method: POST
content_type: application/json
請求參數:
{"text": "測試蔡坨坨"
}
接口調用:
點擊元素
Selenium腳本:
driver.find_element(By.XPATH, "//input[@id='su']").click()
源碼分析:
接口信息:
url: /session/$sessionId/element/$id/click
method: POST
content_type: application/json
接口調用:
關閉瀏覽器
Selenium腳本:
driver.quit()
源碼分析:
接口信息:
url: /session/$sessionId
method: DELETE
content_type: application/json
接口調用: