一、前言
上一章《曲鳥全堆疊UI自動化教學(六):開始實戰吧!實戰環境準備》 我們通過使用禪道真正的實作了第一個實戰腳本,文末的練習題小伙伴實作了嗎?下面為你公布答案,
【Python測驗交流群:8140 78962】
個人在用的人工智能學習網站推薦給大家:captainai
文章目錄
- 一、前言
- 二、公布上一章練習題答案
- 三、答案和不足分析
- 四、Pytest簡單介紹和注意事項
- 五、搭建自動化測驗框架
- 1. 安裝pytest
- 2. 框架思路分析
- 1)資料層面
- 2)代碼層面
- 3)執行效果
- 六、總結
二、公布上一章練習題答案
記得把你對應谷歌瀏覽器版本的chromedriver放入專案中:
import datetime
import random
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.implicitly_wait(2)
driver.maximize_window()
driver.get('http://127.0.0.1/zentao/user-login.html')
time.sleep(0.5)
driver.find_element(By.XPATH,'//*[@id="account"]').send_keys('admin')
time.sleep(0.5)
driver.find_element(By.XPATH,'//*[@id="loginPanel"]/div/div[2]/form/table/tbody/tr[2]/td/input').send_keys('替換為你自己的密碼') #這里替換為你自己的密碼
time.sleep(0.5)
driver.find_element(By.XPATH,'//*[@id="submit"]').click()
time.sleep(0.5)
driver.find_element(By.XPATH,'//*[@id="menuMainNav"]/li[3]/a').click()
driver.switch_to.frame('appIframe-product')
time.sleep(0.5)
y=driver.find_elements(By.XPATH,'//a[@class="btn btn-primary create-product-btn"]')
time.sleep(0.5)
driver.find_element(By.XPATH,'//*[@id="mainMenu"]/div[2]/a[3]').click()
time.sleep(0.5)
driver.find_element(By.XPATH,'//*[@id="name"]').send_keys('selenium2')
time.sleep(0.5)
driver.find_element(By.XPATH,'//*[@id="code"]').send_keys('002')
time.sleep(0.5)
driver.find_element(By.XPATH,'//*[@id="submit"]').click()
三、答案和不足分析
之前練習題主要是將整個流程進行了串聯,其中有個特殊的操作是需要切換iframe,其他就沒什么特殊的地方了,
但如果按照上面的代碼寫的話,實際上是非常冗余和低效的,首先,為了實作每個步驟都等待0.5秒執行,我們在所有步驟代碼之間都加了代碼time.sleep(0.5),而且對測驗用例沒有很好的管理,未對操作事件、元素地址等進行封裝,導致可讀性低、維護性低等,
所以寫出自動化腳本很簡單,但這并不代表你掌握了自動化,能夠勝任一份自動化測驗的作業,也正因如此,我們需要搭建自動化測驗框架,將資料和代碼操作進行分離,封裝有用的公共方法來提高我們的效率,
下面我們結合pytest對我們的代碼進行一些優化,讓自動化框架初具模型,
四、Pytest簡單介紹和注意事項
pytest是一個非常成熟的全功能的Python測驗框架,功能很全,很靈活,能夠與很多第三方插件進行結合,比如:pytest-html(完美html測驗報告生成)、pytest-rerunfailures(失敗case重復執行)、pytest-xdist(多CPU分發)等;還可以跟類似Jenkins的CI工具進行結合,
小伙伴可能在網上發現很多教程的自動化是下面這樣寫的,一條用例就要寫一個函式方法:

這里極其不推薦這樣做的!等于每次寫用例還要寫代碼,這是嚴重的低效率和低維護的行為,不可取!
五、搭建自動化測驗框架
1. 安裝pytest
cmd執行如下命令:
pip install pytest -i https://pypi.tuna.tsinghua.edu.cn/simple some-package
2. 框架思路分析
我們理想的效果是測驗用例跟代碼進行分離,也就是說當我們撰寫測驗用例的時候,不需要去改動哪怕一行代碼,
1)資料層面
我們先來分析資料層面,對于Selenium的操作,無論是點擊、還是輸入、還是強制等待等最多需要四樣引數:
- 元素地址;
- 定位方式;
- 操作方式(點擊/輸入內容/強制等待/訪問網址 等);
- 操作的值(部分操作有,例如:輸入內容、強制等待操作需要、點擊操作不需要);
現在我們來用Excel實際的寫一個測驗用例【用戶打開禪道并輸入正確的帳號密碼進行登錄】:

清晰明了的知道了每步操作需要干嘛及使用了什么樣的引數,
2)代碼層面
用例寫好了,該考慮如何寫代碼了,我們需要寫個方法來適配上述用例的執行,需要的功能點:
- 能根據填寫的操作方式選擇正確的selenium的執行方法,例如上述用例中操作方式為get,那該方法會執行
driver.get方法并將【操作的值】中的資料作為網址進行執行; - 能夠根據用例【定位方式】的內容選擇正確的定位方式進行執行;
- 元素地址能夠正確的填寫;
- 操作的值也是同理;
根據上述要求寫了如下的代碼,先看目錄結構:

再看具體代碼
1)main.py:
import pytest
# 執行測驗用例
pytest.main(['test_case.py'])
2)comDef.py:
from openpyxl import load_workbook
def load_excel(file):
"""
用于讀取測驗用例所在的表格
"""
_data = load_workbook(file)
_value = _data.active
return _value
def parse_case(file):
"""
用于將excel中的測驗用例轉為pytest可識別的測驗用例
"""
excel_value = load_excel(file)
_cases = []
for i in range(2, excel_value.max_row + 1):
_cases.append({'path': excel_value['B' + str(i)].value, 'location_method': excel_value['C' + str(i)].value,
'action': excel_value['D' + str(i)].value, 'value': excel_value['E' + str(i)].value})
return _cases
3)test_case.py:
import pytest
import time
from selenium.webdriver.common.by import By
from selenium import webdriver
from comDef import parse_case
# 初始化driver
driver = webdriver.Chrome()
driver.implicitly_wait(2)
driver.maximize_window()
@pytest.mark.parametrize("data", parse_case('自動化測驗用例.xlsx'))
def test_run_case(data):
path, location_method = data.get('path'), data.get('location_method')
action, value = data.get('action'), data.get('value')
if path:
if location_method:
_driver = driver.find_element(getattr(By, location_method), path)
if action == 'click':
_driver.click()
elif action == 'send_keys' and value:
_driver.send_keys(value)
elif value:
if action == 'sleep':
time.sleep(float(value))
elif action == 'get':
driver.get(value)
else:
return False
3)執行效果

六、總結
上面的代碼看不懂不要緊,后面會進行講解,(完整代碼獲取可以關注文末下方的公眾號回復:專案代碼,進行獲取)現在我們已經實作了一個自動化測驗框架雛形,達到了資料和代碼的分離,用戶只需要填寫excel就能夠達到執行自動化測驗的效果,
但剛剛也說了,這個框架只是個雛形,很多功能還還需增加,比如:
- 更多操作的封裝(切換iframe,切換視窗,滾動、獲取文本等);
- 每步執行成功失敗的校驗和結果存盤;
- 元素地址的管理;
- 測驗報告的生成;
- 基于步驟的斷點除錯;
- 用例失敗重試;
小伙伴可以先按自己的理解進行上述功能的實作,后續我也會繼續進行分享!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/337707.html
標籤:python
