美文网首页自动化测试笔记
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