python web自動化框架架構思路整理

一. 文件結構

在這裏插入圖片描述

  • 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)的判斷方法傳參,因爲其參數爲元組

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章