一. 文件結構
- learn 忽略無用的可以刪除
- PageElement 存放每個頁面的元素定位表達式和定位方式文件
- PageObjects 存放每個頁面的驗證的操作事件文件
- TestCase 存放每個頁面的測試用例文件
- TestData 存放每個頁面的測試數據文件
二. 目錄下的具體文件
1.PageObjects目錄
秉承頁面元素操作和用例分離的原則,該文件夾下存放的文件中只保存對元素操作的方法,如獲取元素並對其進行點擊操作等事件行爲,還有獲取元素的文本內容等屬性操作行爲。
-
根據頁面來創建文件,如登陸頁面文件、首頁頁面文件、充值頁面等,每個頁面都單獨出來,即po模型;
-
一個頁面一個文件,每個頁面封裝成一個類,如登陸頁面就封裝爲Login類;
-
每個文件中只寫該頁面中要驗證的測試動作,如登陸頁面中包含的操作有登陸、忘記密碼、註冊三部分,一個部分是一個類裏面的方法;
-
如登陸
先等待頁面加載完成
再定位輸入框和登陸按鈕元素
向輸入框內填入測試的數據
最後執行點擊登陸操作
# 登陸
def login(self,username_value,password_value):
# 輸入用戶名
# 輸入密碼
# 點擊登陸
# 等待頁面加載完成後執行操作
time.sleep(0.5)
# 獲取操作的元素
username=self.driver.find_element(*LoginEles.user_name)
password=self.driver.find_element(*LoginEles.password)
login_btn=self.driver.find_element(*LoginEles.login_btn)
# 向輸入框輸入數據
username.send_keys(username_value)
password.send_keys(password_value)
# 點擊登陸
login_btn.click()
- 忘記密碼和註冊方法,都是先使用WebDriverWait等待20秒後檢查該元素是否存在,存在的話執行click操作
WebDriverWait(self.driver,20).until(EC.visibility_of_element_located(''))
self.driver.find_element('').click()
2.TestCase目錄
由於用例的執行環境會不同,所以將selenium的webdriver提取到了用例文件中,然後作爲參數傳遞給page文件,這樣就可以控制執行的瀏覽器環境了
-
使用unittest.TestCase進行用例l類的編寫
-
用例類執行開始先做一些初始化操作
打開登陸頁面
初始化登陸頁面的操作類
將登陸頁面的地址提取到TestData文件夾下的common.py公共數據文件中,方便後期修改和維護
@classmethod
def setUpClass(cls):
# 前置 成功訪問登陸頁面
cls.driver = webdriver.Chrome()
cls.driver.maximize_window()
cls.driver.get(CD.login_url)
cls.lg = LoginPage(cls.driver)
- 所有的用例執行完成後,關閉瀏覽器
@classmethod
def tearDownClass(cls):
# 關閉瀏覽器,當所有用例都執行完成之後
cls.driver.quit()
- 每條用例執行完都要刷新頁面
def tearDown(self):
# 當每條用例執行完成後刷新頁面
self.driver.refresh()
- 根據測試用例文檔編寫測試用例
步驟 輸入用戶名:XXX 密碼:XXX 點擊登陸;
斷言 成功登陸首頁當中-能否找到 退出 這個元素,失敗有對應的信息;
斷言中的查找元素和獲取元素中文字的方法封裝到index_page文件中,使得用例和元素操作分離,以後好維護
將測試數據單獨提取到TestData下的login文件中,這樣便於以後維護及修改
# 異常用例-手機號碼格式不正確 多種錯誤格式但是斷言一樣可以使用ddt
# 錯誤格式:手機號碼爲10位、12位、包含特殊字符
@data(*LD.error_phone)
def test_01_error_phone(self,item):
# 步驟 輸入用戶名:格式不正確的手機號碼 密碼:XXX 點擊登陸
self.lg.login(item['user'], item['password'])
# 斷言 提示請輸入正確的手機號
self.assertEqual(self.lg.get_errorMsg(),item['msg'])
測試數據類似的可以封裝到一起,這樣可以使用ddt,減少重複用例
# 錯誤格式:手機號碼爲10位、12位、包含特殊字符、手機號碼爲空
error_phone=[
{'user':'1555808693','password':'xueqian72','msg':'請輸入正確的手機號'},
{'user':'155580869377','password':'xueqian72','msg':'請輸入正確的手機號'},
{'user':'1555808693%','password':'xueqian72','msg':'請輸入正確的手機號'},
{'user':'','password':'xueqian72','msg':'請輸入手機號'}
]
- 可以修改用例的名字來決定測試的先後順序如test_01_login
- 因爲正常登陸後會跳轉到網站首頁,其他驗證用例就沒法執行了,所以正常登陸的用例要放到最後執行
3.PageElement目錄
在PageObjects目錄下的文件中的獲取元素的方法和表達式式都寫在文件中的話,以後有改動的話不容易找到對應元素和方法,爲了好維護就將獲取元素的方法和表達式單獨提取了出來,並且一個頁面對應一個文件。
driver.find_element()方法可以傳入獲取方式和元素表達式,這樣就可以動態使用不同的方式獲取方法了,只需要傳入By對應的方法就可以了
# 用戶輸入框
user_name = (By.CSS_SELECTOR,".username")
# 密碼輸入框
password = (By.XPATH,"//input[@name='password']")
注意給driver.find_element()方法傳入參數的時候需要使用*展開
將數據寫成元組,主要式爲了方便給EC(expected_conditions)的判斷方法傳參,因爲其參數爲元組