Python+Selenium筆記(十三):Page Object設計模式,pythonselenium

來源:互聯網
上載者:User

Python+Selenium筆記(十三):Page Object設計模式,pythonselenium

(一) 前言

簡單的說就是分為2層,頁面class 和測試class。

頁面class:分為父類和子類(子類指具體的頁面,每一個頁面都建立一個類),父類中定義公有的屬性和方法(操作)。

#對物件導向有瞭解的,應該很容易理解抽象出公有屬性和方法的意思

#父類和子類我是按自己的理解進行描述的,或者可以說basepage對象(父物件,提供公有的屬性、方法) 和 page對象(具體哪一個頁面)

測試class:按照商務程序,對各個頁面的屬性、操作進行組合,形成一個測試案例。

使用page object模式,抽象出各個頁面的元素、方法,然後再按照測試案例的要求進行組合。這樣做的好處是

1、頁面修改了,只要對頁面類進行修改就好了,對測試類別(測試案例)沒太大影響

2、可以在多個測試複用部分代碼。

3、測試代碼(測試類別、測試案例)部分變得更易讀、靈活、可維護。

我把上一篇的代碼按照page object模式修改了下,代碼如下。

(二) 父類(BasePage對象,base.py)

 1 from abc import abstractclassmethod 2 class BasePage(object): 3     def __init__(self,driver): 4         self.driver = driver 5  6     '''驗證頁面是否是指定的頁面。 7     @abstractclassmethod修飾符指該方法是抽象的''' 8     @abstractclassmethod 9     def validate_page(self,driver):10         return

(三) 首頁(page對象(子類),homepage.py)

 1 from base import BasePage 2 class HomePage(BasePage): 3     #用來定位頁面元素的ID、NAME、XPTH、CSS運算式等 4     _login_area = '#login_area' 5     _register = '註冊' 6  7     def validate_page(self,driver): 8         return driver.title == '部落格園 - 開發人員的網上家園' 9     #定位並點擊 註冊10     def register_click(self):11         self.login_area = self.driver.find_element_by_css_selector(self._login_area)12         self.login_area.find_element_by_link_text(self._register).click()

(四) 註冊頁面(page對象(子類),registerpage.py)

 1 from base import BasePage 2 class RegisterPage(BasePage): 3     # 用來定位頁面元素的ID、NAME、XPTH、CSS運算式等 4     _user_email = 'Email' 5     _user_phone_country = 'CountryCode' 6     _user_phone = 'PhoneNum' 7     _user_login_name = 'LoginName' 8     _user_nickname = 'DisplayName' 9     _user_password = 'Password'10     _user_confirm_password = 'ConfirmPassword'11     _phone_error = 'PhoneNum-error'12     _loginName_error = 'LoginName-error'13 14     def validate_page(self,driver):15         return driver.title == '使用者註冊 - 部落格園'16 17     #輸入註冊資訊18     def send_keys(self,email,phone,login_name,nickname,password,confirm_password):19         self.driver.find_element_by_id(self._user_email).clear()20         self.driver.find_element_by_id(self._user_phone).clear()21         self.driver.find_element_by_id(self._user_login_name).clear()22         self.driver.find_element_by_id(self._user_nickname).clear()23         self.driver.find_element_by_id(self._user_password).clear()24         self.driver.find_element_by_id(self._user_confirm_password).clear()25         self.driver.find_element_by_id(self._user_email).send_keys(email)26         self.driver.find_element_by_id(self._user_phone).send_keys(phone)27         self.driver.find_element_by_id(self._user_login_name).send_keys(login_name)28         self.driver.find_element_by_id(self._user_nickname).send_keys(nickname)29         self.driver.find_element_by_id(self._user_password).send_keys(password)30         self.driver.find_element_by_id(self._user_confirm_password).send_keys(confirm_password)31 32     #手機號碼有誤時的提示資訊33     def phone_err(self):34         phone_error = self.driver.find_element_by_id(self._phone_error)35         return phone_error.text36 37     #登入名稱不合法時的提示資訊38     def loginName_error(self):39         loginName_error = self.driver.find_element_by_id(self._loginName_error)40         return loginName_error.text

(五)   測試類別(測試案例,testRegisterNewUser.py)

 1 from selenium import webdriver 2 from ddt import ddt,data,unpack 3 import xlrd 4 from homepage import HomePage 5 from registerpage import RegisterPage 6 from basetestcase import BaseTestCase 7 #讀取Excel資料的函數 8 def get_data(file_name): 9     rows = []10     book = xlrd.open_workbook(file_name)11     sheet = book.sheet_by_index(0)12     for r_idx in range(1, sheet.nrows):13         rows.append(list(sheet.row_values(r_idx,0)))14         pthone = rows[r_idx - 1].pop(1)15         rows[r_idx - 1].insert(1, str(int(pthone)))16     return rows17 @ddt18 class RegisterNewUserDDT(BaseTestCase):19     #重寫setUpClass()20     @classmethod21     def setUpClass(cls):22         cls.driver = webdriver.Chrome()23         cls.driver.implicitly_wait(30)24         cls.driver.maximize_window()25         cls.driver.get('https://www.cnblogs.com/')26         #建立HomePage()類的對象執行個體27         home_page = HomePage(cls.driver)28         home_page.register_click()29     # 讀取excel檔案的資料作為參數30     @data(*get_data('data/reTest.xlsx'))31     @unpack32     def test_register_new_user(self,email,phone,login_name,nickname,password,confirm_password,expected_result):33         #建立RegisterPage()的對象執行個體34         register_page = RegisterPage(self.driver)35         self.assertTrue(register_page.validate_page(self.driver))36         register_page.send_keys(email,phone,login_name,nickname,password,confirm_password)37         if phone == '1':38             self.assertTrue(register_page.phone_err() == expected_result)39         elif login_name == 'b':40             self.assertTrue(register_page.loginName_error() == expected_result)

(六) 測試準備(basetestcase.py)

#這部分本來想放到第二步的,不過感覺有點影響對page object的理解,就放到最後了

  建立一個類,定義setup()和teardowm()方法,方便所有測試複用。這個類可以理解為是測試類別的一部分,我只是把所有測試類別(測試案例)都用到的setup()和teardowm()拿出來,方便複用。如果哪個測試案例有特殊要求,也可以重寫。

 1 import unittest 2 from selenium import webdriver 3  4 class BaseTestCase(unittest.TestCase): 5     @classmethod 6     def setUpClass(cls): 7         cls.driver = webdriver.Chrome() 8         cls.driver.implicitly_wait(30) 9         cls.driver.maximize_window()10         cls.driver.get('https://www.cnblogs.com/')11     @classmethod12     def tearDownClass(cls):13         cls.driver.quit()

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.