轉載請註明出處❤️
作者:測試蔡坨坨
原文連結:caituotuo.top/1db4fa44.html
你好,我是測試蔡坨坨。
看到這篇文章的標題,是不是有小夥伴會感到驚訝呢?
Postman不是做介面測試的嗎?為什麼還能做UI自動化測試呢?
其實,只要你瞭解Selenium的執行原理,就可以理解為什麼Postman也能實現UI自動化測試了。
執行程式碼,啟動瀏覽器後,webdriver會將瀏覽器繫結到特定的埠,作為webdriver的remote server(遠端伺服器端),而client(使用者端,也就是測試指令碼,可以是Python或者Java程式碼)會藉助CommandExecutor建立sessionId,傳送http請求給remote server,remote server收到http請求後,呼叫webdriver完成操作,並將http響應結果返回給client。
所以,本質上是呼叫http請求的過程,因此也就可以理解為什麼可以使用Postman實現UI自動化測試。
以上我們知道了Selenium的底層原理其實就是呼叫http請求的過程,那麼我們要想呼叫介面就需要知道介面資訊,包括請求方式、請求地址、請求引數、請求格式等。
這些介面資訊,我們可以通過對原始碼的分析得到。
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
介面呼叫:
連結:https://pan.baidu.com/s/12lzuy0f-o7aVO0oYgw3OMg
提取碼:ctta