項目開源: https://github.com/tonglei100/sweetestpython
文章轉載:https://segmentfault.com/a/1190000011612061git
sweetest 是一款 Web 自動化測試框架,或者說是解決方案,名字取 Selenium, Web UI, Excel, Element, Test 含義。
特色:github
目前,Web 自動化測試基本上是以 Selenium 爲接口來編寫測試代碼,但效果每每不是很好,廣泛遇到以下問題:chrome
咱們知道,傳統的測試用例通常是在 Excel 中用文本編寫的,若是自動化測試用例也這麼寫,是否是就能夠解決問題1和2?
對於問題3,我想是時候對開發提出一些要求了,同時咱們的元素定位也要優化,讓頁面自由的去變化,而咱們的定位只作最小適用。vim
測試用例以下圖:
segmentfault
pip install sweetest
瀏覽器
打開 cmd 命令窗口,切換到某個目錄,如:D:Autotest框架
sweetest
cd sweetest_sample python start.py
OK,若是一切順利的話,sweetest 已經跑起來了工具
目錄 | 說明 |
---|---|
element\ | 頁面元素表目錄 |
Baidu-Elements.xlsx | 頁面元素表,名稱格式:project_name + "-Elements.xlsx" |
junit\ | junit格式測試結果目錄 |
log\ | 自動化測試運行日誌目錄 |
report\ | Excel 格式測試結果目錄 |
snapshot\ | 錯誤截圖目錄 |
testcase\ | 測試用例目錄 |
Baidu-TestCase.xlsx | 測試用例,名稱格式:project_name + "-TestCase.xlsx" |
start.py | 啓動腳本,test = Autotest(project_name, sheet_name) |
備註:以上3處的 project_name 必須一致測試
頁面元素表的做用主要是把元素定位獨立出來,一是方便維護定位信息,二是測試用例中用元素名稱書寫,可讀性更高。
目錄 | 註釋 |
---|---|
page | element 所在的頁面,在全部頁面均可用的 element 放在「通用」下面,如 title |
frame | element 所在的 frame id,若是是頂層 frame,可爲空。 |
name | element 名稱,在不一樣的 page 下面能夠同名 |
by | Selenium 定義方式 |
value | Selenium 定義的值 |
備註 | 註釋做用 |
id, link_text, partial_link_text, xpath, class_name
如:
page | name | by | value |
---|---|---|---|
百度搜索頁面 | 搜索框 | id | kw |
則自動化運行時會以 find_element_by_id('kw')
來定位
帶變量的定位方式
如示例中:
page | name | by | value |
---|---|---|---|
百度搜索頁面 | 搜索結果# | xpath | //*[@id="#"]/h3/a |
寫用例時,須要在 搜索結果# 後面帶上變量,如: 搜索結果#1
操做 | 頁面 | 元素 |
---|---|---|
點擊 | 百度搜索頁面 | 搜索結果#1 |
則自動化運行時會以 find_element_by_xpath('//*[@id="1"]/h3/a')
來定位
已定義好的經常使用變量定位方式:
如:url#www.baidu.com
固然,若是#後面的變量不夠直觀的話,不建議太多使用這幾個變量方式。
頁面的 title
頁面URL
頁面的 url
通常來說,導航欄在全部頁面都存在,應該把導航欄放在「通用」下面,作成變量定位方式,如示例中的:
page | name | by | value |
---|---|---|---|
通用 | 搜索頁導航欄# | xpath | //*[@class="s_tab"]//a[text()="#"] |
用例中的寫法:
操做 | 頁面 | 元素 |
---|---|---|
點擊 | 通用 | 搜索頁導航欄#新聞 |
操做、頁面、元素這些列其實都是選項列表,利用 Excel 的下拉菜單功能,可以讓書寫用例更方便,且不易筆誤。
下圖是測試用例文件中的 ElementsMap 頁面:
咱們能夠經過 Excel 的菜單欄「公式-名稱管理器」來配置這些菜單,同時在用例頁面經過「數據-數據有效性」配置好「操做」的下拉菜單,以及「頁面-元素」的二級聯動下拉菜單。
必填字段:
注意事項:
即 get
方法,打開一個連接。
打開操做,通常要在測試數據中指定新窗口名稱,如:新窗口=百度搜索窗口。
檢查
取頁面元素的值、屬性和預期結果對比。
測試數據中若是沒有寫「k=v」的方式,則默認是取元素的 text。
操做 | 頁面 | 元素 | 測試數據 |
---|---|---|---|
檢查 | 百度搜索頁面 | 搜索按鈕 | 百度一下 |
等價於
操做 | 頁面 | 元素 | 測試數據 |
---|---|---|---|
檢查 | 百度搜索頁面 | 搜索按鈕 | text=百度一下 |
操做 | 頁面 | 元素 | 測試數據 |
---|---|---|---|
檢查 | 百度搜索頁面 | 搜索框 | name=wd |
操做 | 頁面 | 元素 | 測試數據 |
---|---|---|---|
檢查 | 百度搜索頁面 | 頁面標題 | 百度一下,你就知道 |
注意:測試數據中,因爲逗號(,or ,)是多個「k=v」的分隔符,因此若是 v 中有逗號,要用反斜槓(\)轉義;但等號(=)無需轉義。
在輸入框中輸入文本。
測試數據列爲要輸入的內容。
點擊
點擊按鈕或者連接等(一切可點擊操做的)元素。此關鍵字支持在同一個頁面上順序點擊多個元素,在元素列以豎槓(|)分割便可,如:
操做 | 頁面 | 元素 |
---|---|---|
點擊 | 百度搜索頁面 | 搜索按鈕|搜索結果#1 |
有些頁面元素,當鼠標移動到上面時,會彈出下拉菜單等。此操做同關鍵字「點擊」相似。
執行
即執行測試用例片斷,支持在測試數據中給變量賦值,如咱們有用例片斷 SNIPPET_001,則測試用例 BAIDU_002 中,步驟1以下:
操做 | 頁面 | 元素 | 測試數據 |
---|---|---|---|
執行 | 用例片斷 | SNIPPET_001 | keywords=搜狗 |
把變量 keyswords 賦值爲「搜狗」,此步驟會執行用例片斷 SNIPPET_001,其搜索的關鍵字爲「搜狗」。
把檢查結果反向,此關鍵字暫時未完整實現。
測試數據支持模糊匹配,以下:
操做 | 頁面 | 元素 | 測試數據 |
---|---|---|---|
檢查 | 通用 | 頁面標題 | *知乎 |
則,頁面標題中含有「知乎」即爲經過。注意星號(*)要寫在開頭。
在運行時,把元素的值或屬性賦值給變量,此變量能夠在以後的步驟中使用"<>"引用變量名。
操做 | 頁面 | 元素 | 測試數據 | 輸出數據 |
---|---|---|---|---|
點擊 | 百度搜索頁面 | 搜索結果#1 | title=text | |
檢查 | 通用 | 頁面標題 | <title> |
除了控制語句符號外,步驟編號必須爲數字,建議在 Excel 中設置爲文本格式。
控制語句:
if then else
步驟編號 | 操做 | 頁面 | 元素 | 測試數據 |
---|---|---|---|---|
^3 | 檢查 | 通用 | 頁面標題 | *知乎 |
>4 | 點擊 | 通用 | link#登陸 | |
<5 | 點擊 | 通用 | link#註冊機構號 |
^ 表示 if 語句
> 表示 then 語句
< 表示 else 語句
if(^) 語句爲真時,執行 then(>) 語句,爲否時執行 else(<) 語句。不管後面有沒有 then 或者 else 語句,不影響後續步驟執行。
then 語句 或者 else 語句,當不被執行時,測試結果爲 '-',不影響測試用例結果和後續步驟執行。當執行時,和正常步驟同樣,成功則繼續,失敗則該用例失敗。
測試用例中元素是以 page + name 爲惟一標識,來頁面元素表中查找定位信息的。所以,不一樣 page 下的元素 name 能夠相同,但不能和「通用」下的相同。
測試用例中,若是 page 不爲「通用」,當 <page> + name 查找不到,會繼續以 「通用」 + name 爲標識符來查找。
「通用」是方便咱們寫頁面元素表的,寫用例時咱們建議仍是用 <page> 來代替「通用」,甚至有時候咱們必須這麼作。
在瀏覽器中,有可能會打開多個標籤頁,咱們叫它爲窗口。當你新打開一個標籤頁時,你能夠在測試數據中給它起個名字,格式爲:新窗口=<window_name>, 如:
操做 | 頁面 | 元素 | 測試數據 |
---|---|---|---|
打開 | 通用 | 百度搜索連接 | 新窗口=百度搜索窗口 |
檢查 | 百度搜索頁面 | 頁面標題 | 百度一下,你就知道 |
當你給新的標籤頁起了窗口名字,它以後步驟的頁面("通用"除外)就會綁定到這個窗口。如上面第 2 步,「百度搜索頁面」會綁定到「百度搜索窗口」。那麼以後的步驟或用例中,即便打開了多個標籤頁,只要頁面是「百度搜索頁面」,就會切換到「百度搜索窗口」這個標籤頁上操做。
注意:「通用」是不綁定到任何窗口的,也不作窗口切換,它直接在「當前窗口」操做。
「當前窗口」規則爲:
注意:
python start.py
見 report 目錄