Postman實現UI自動化測試

2023-01-15 06:00:39

轉載請註明出處❤️

作者:測試蔡坨坨

原文連結:caituotuo.top/1db4fa44.html


你好,我是測試蔡坨坨。

看到這篇文章的標題,是不是有小夥伴會感到驚訝呢?

Postman不是做介面測試的嗎?為什麼還能做UI自動化測試呢?

其實,只要你瞭解Selenium的執行原理,就可以理解為什麼Postman也能實現UI自動化測試了。

Selenium底層原理

執行程式碼,啟動瀏覽器後,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

介面呼叫:

postman_collection.json

連結:https://pan.baidu.com/s/12lzuy0f-o7aVO0oYgw3OMg
提取碼:ctta