美文网首页自动化测试笔记
Selenium(一)——Page Object Model (

Selenium(一)——Page Object Model (

作者: 小楼_987f | 来源:发表于2019-05-19 18:33 被阅读17次

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())

相关文章

网友评论

    本文标题:Selenium(一)——Page Object Model (

    本文链接:https://www.haomeiwen.com/subject/wtpqzqtx.html