1. 简介
-
POM是什么
Page Object Model (POM) 直译为“页面对象模型”,这种设计模式旨在为每个待测试的页面创建一个页面对象(class),将那些繁琐的定位操作封装到这个页面对象中,只对外提供必要的操作接口。 -
POM 有什么好处
POM 将页面定位和业务操作分开,分离了测试对象和测试脚本,如果UI更改页面,测试脚本不需要更改,只需要更改页面对象中的某些代码就可以,提高了可维护性。
2. 举个例子
- 比如测试一个登陆页面:新浪微博 ,执行测试的人员传递不同的数据到帐号、密码框就可以了,而不应该去顾虑:页面是否已经加载完成?怎样定位到帐号输入框?怎样定位到登陆按钮等等问题。
这些问题全部交由登陆页面的“页面对象”去解决并封装起来,只提供给测试人员三个接口方法:1.帐号输入接口、2.密码输入接口、3.提交接口。 - 首先定义一个基本页面 BasePage类 ,定义基本的页面操作,提供给其他页面去继承,basePage.py 内容如下:
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 基础页面,提供给其他页面继承
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参数指定的页面,
20 并检查打开是否正确
21 """
22 self.driver.get(url)
23 # 显式等待10秒,如果打开页title与预期不符或者超时,抛出异常
24 WebDriverWait(self.driver, 10).until(EC.title_is(self.title))
25
26 def open(self):
27 """
28 公共方法,调用私有方法_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: 不关心元素是否可见,只关心元素是否存在在页面中
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 ,内容如下:
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 继承自基础页面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 # 不要迷信开发者工具提供的Xpath,
19 # 比如这里提供的Xpath://*[@id="layer_15582553868501"]/div/p/span[2],
20 # id是动态的,无法使用,需自行推到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 # 预打开页面
41 base_url = 'https://weibo.com/'
42 # 页面title
43 title = '微博-随时随地发现新鲜事'
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())
网友评论