1. 簡介
POM是什么
Page Object Model (POM) 直譯為“頁面對象模型”渊跋,這種設(shè)計模式旨在為每個待測試的頁面創(chuàng)建一個頁面對象(class)劝萤,將那些繁瑣的定位操作封裝到這個頁面對象中沮协,只對外提供必要的操作接口住册。POM 有什么好處
POM 將頁面定位和業(yè)務(wù)操作分開牢屋,分離了測試對象和測試腳本趁矾,如果UI更改頁面耙册,測試腳本不需要更改,只需要更改頁面對象中的某些代碼就可以毫捣,提高了可維護性详拙。
2. 舉個例子
- 比如測試一個登陸頁面:新浪微博 ,執(zhí)行測試的人員傳遞不同的數(shù)據(jù)到帳號蔓同、密碼框就可以了饶辙,而不應(yīng)該去顧慮:頁面是否已經(jīng)加載完成?怎樣定位到帳號輸入框斑粱?怎樣定位到登陸按鈕等等問題弃揽。
這些問題全部交由登陸頁面的“頁面對象”去解決并封裝起來,只提供給測試人員三個接口方法:1.帳號輸入接口、2.密碼輸入接口矿微、3.提交接口痕慢。 - 首先定義一個基本頁面 BasePage類 ,定義基本的頁面操作涌矢,提供給其他頁面去繼承掖举,basePage.py 內(nèi)容如下:
1 from selenium import webdriver
2 from selenium.webdriver.support.wait import WebDriverWait
3 from selenium.webdriver.support import expected_conditions as EC
4
5 class BasePage(object):
6 """
7 基礎(chǔ)頁面,提供給其他頁面繼承
8 """
9 def __init__(self, driver, base_url, title):
10 """
11 初始化
12 """
13 self.driver = driver
14 self.base_url = base_url
15 self.title = title
16
17 def _open(self, url):
18 """
19 私有方法娜庇,打開url參數(shù)指定的頁面,
20 并檢查打開是否正確
21 """
22 self.driver.get(url)
23 # 顯式等待10秒拇泛,如果打開頁title與預(yù)期不符或者超時,拋出異常
24 WebDriverWait(self.driver, 10).until(EC.title_is(self.title))
25
26 def open(self):
27 """
28 公共方法思灌,調(diào)用私有方法_open()打開鏈接
29 """
30 self._open(self.base_url)
31
32 def find_element(self, *loc):
33 """
34 定位指定元素
35 """
36 # 顯式等待元素俺叭,超過10秒未找到則拋出超時異常(TimeoutException)
37 # presence_of_element_located: 不關(guān)心元素是否可見,只關(guān)心元素是否存在在頁面中
38 # visibility_of_element_located: 不僅找到元素泰偿,并且該元素必須可見
39 WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located(loc))
40 return self.driver.find_element(*loc)
41
42 if __name__ == '__main__':
43 driver = webdriver.Chrome()
44 page = BasePage(driver, 'https://www.baidu.com/')
45 page.open()
46 driver.quit()
- 再定義一個 LoginPage類 繼承 BasePage類 熄守,向外提供測登陸方法。文件命名為 xl_login.py 耗跛,內(nèi)容如下:
1 from selenium import webdriver
2 from selenium.webdriver.common.by import By
3 from basePage import BasePage
4
5
6 class LoginPage(BasePage):
7 """
8 新浪微薄登陸頁面
9 繼承自基礎(chǔ)頁面BasePage
10 """
11 # 定位帳號輸入框
12 username_loc = (By.ID, 'loginname')
13 # 定位密碼輸入框
14 password_loc = (By.NAME, 'password')
15 # 定位登陸按鈕
16 submit_loc = (By.XPATH, '//*[@id="pl_login_form"]/div/div[3]/div[6]/a')
17 # 定位提示信息裕照,如:請輸入驗證碼
18 # 不要迷信開發(fā)者工具提供的Xpath,
19 # 比如這里提供的Xpath://*[@id="layer_15582553868501"]/div/p/span[2]调塌,
20 # id是動態(tài)的晋南,無法使用,需自行推到Xpath
21 message_loc = (By.XPATH, '//div[@class="content layer_mini_info"]/p/span[2]')
22
23 # 輸入用戶名操作
24 def type_username(self, username):
25 self.find_element(*self.username_loc).send_keys(username)
26
27 # 輸入密碼操作
28 def type_password(self, password):
29 self.find_element(*self.password_loc).send_keys(password)
30
31 # 點擊登陸按鈕操作
32 def submit(self):
33 self.find_element(*self.submit_loc).click()
34
35 # 獲取提示信息
36 def get_message(self):
37 return self.find_element(*self.message_loc).text
38
39 if __name__ == '__main__': # 測試登陸
40 # 預(yù)打開頁面
41 base_url = 'https://weibo.com/'
42 # 頁面title
43 title = '微博-隨時隨地發(fā)現(xiàn)新鮮事'
44 # 準備好待輸入的用戶名和密碼
45 username = 'haha'
46 password = 'hehe'
47
48 # 打開Chrome瀏覽器
49 driver = webdriver.Chrome()
50 # 登陸頁面初始化
51 login = LoginPage(driver, base_url, title)
52 # 打開新浪微博頁
53 login.open()
54 # 輸入用戶名
55 login.type_username(username)
56 # 輸入密碼
57 login.type_password(password)
58 # 點擊登陸
59 login.submit()
60 # 打印提示信息
61 print(login.get_message())