PO设计模式是selenium自动化测试中最佳的设计模式之一

Page Object Model:

PO设计模式是selenium自动化测试中最佳的设计模式之一,主要体现在对界面交互细节的封装,也就是在实际测试中只关注业务流程就OK了

传统的设计中,在新增测试用例之后,代码会有以下几个问题:

1.易读性差:一连串的find element会使代码显得杂乱无章

2.可扩展性不好:用例孤立,无法扩展

3.可复用性差:无公共方法,很难复用

4.可维护性差:一旦元素变化,需要维护修改大量测试用例

因此考虑到优化:

PO模式是一种自动化测试设计模式,讲页面定位和业务操作分开,也就是把对象的定位和测试脚本分开,从而提供可维护性。

首先抽象封装一个BasePage类,这个基类拥有一些指向Webdriver实例的属性,然后每一个Page继承基类BasePage,可以通过driver管理每一个Page中的元素,而且在Page中将这些操作封装为一个一个的方法。TestCase继承unittest里面的TestCase类,并且依赖page类,进行组织测试步骤的工作。

这样做的好处,就是有元素变化,只需要维护每一个Page就行了,测试步骤变化,只需要维护TestCase即可

PO各个核心要素的介绍:

BasePage:

  1. class BasePage(object):

  2. def __init__(self,driver):

  3. self.driver = driver

  4. pass

 Page:

  1. from SeleniumProject.PO.BasePage import BasePage

  2. class LoginBase(BasePage):

  3. # 定位元素,括号中是通过find_element来获取元素的属性

  4. uname = ()

  5. pwd = ()

  6. def set_uname(self,uname):

  7. name =self.driver.find_element(*LoginBase.uname)

  8. name.send_keys("用户名")

  9. def set_pwd(self,pwd):

  10. password = self.driver.find_element(*LoginBase.pwd)

  11. password.send_keys("密码")

  12. pass

TestCase:

  1. from unittest import TestCase

  2. import unittest

  3. from selenium import webdriver

  4. class Test_Login(TestCase):

  5. def setUp(self):

  6. self.driver = webdriver.Chrome()

  7. self.driver.get("https://cn.bing.com/")

  8. # 测试步骤

  9. def test_Login(self):

  10. self.driver.get(self.base_url)

  11. pass

  12. def tearDown(self):

  13. self.driver.quit()

  14. if __name__ == "__main__":

  15. unittest.main()

下面举一个简单的例子来看一下PO模式:

业务要求就是,用Chrome浏览器,在https://cn.bing.com/中搜索“墨菲特”,然后点击搜索按钮,再关闭浏览器

基类BasePage类:

  1. from selenium import webdriver

  2. from selenium.webdriver.support.wait import WebDriverWait

  3. from selenium.webdriver.support import expected_conditions as EC

  4. class BasePage(object):

  5. """BasePage封装所有页面的公有方法,例如url、driver、find_element"""

  6. # 构造函数里面的参数就是类的所有参数

  7. def __init__(self,selenuime_driver,base_url):

  8. self.driver = selenuime_driver

  9. self.url = base_url

  10. # 定义一个私有方法,其他类不能调用该方法

  11. def _open(self,url):

  12. self.driver.get(url)

  13. self.driver.maximize_window()

  14. # 定义open()方法,调用_open()方法

  15. def open(self):

  16. self._open(self.base_url)

  17. # 重写find_element()方法,参数为任意数量的(带*的参数)

  18. # 此方法是为了保证元素是可见的

  19. def find_emelemt(self,*loc):

  20. try:

  21. # 保证元素可见

  22. WebDriverWait(self.driver,10).until(EC.visibility_of_all_elements_located(loc))

  23. return self.driver.find_element(*loc)

  24. except:

  25. print("页面中没有%s %" % (self.loc))

  26. # 定义script()方法,用于执行JS脚本,比方上上传文件啥的

  27. def script(self,src):

  28. self.driver.excute_script(src)

  29. # 定义页面跳转方法,比方说有的页面有frame嵌套

  30. def switch_frame(self,loc):

  31. return self.driver.switch_to_frame(loc)

  32. # 重新定义send_keys()方法,为了保证搜索按钮是否存在,还有有的输入框中默认有值,要清空

  33. def send_keys(self,loc,value,clear_first=True,click_first=True):

  34. try:

  35. # getattr方法相当于实现了self.loc

  36. loc = getattr(self,"_%s"%loc)

  37. # 是否存在搜索按钮

  38. if click_first:

  39. self.find_element(*loc).click()

  40. # 清空搜索框中的值,并输入需要搜索的值

  41. if clear_first:

  42. self.find_emelemt(*loc).clear()

  43. self.find_emelemt(*loc).send_keys(value)

  44. except:

  45. print("页面上未找到%s元素"%(self.loc))

Page类:

  1. from selenium.webdriver.common.by import By

  2. from SeleniumProject.PO.BasePage import BasePage

  3. class SearchPage(BasePage):

  4. # 定位元素

  5. search_loc = (By.NAME,"q") #搜索框

  6. btn_loc = (By.NAME,"go") #搜索按钮

  7. # 重写父类的open()方法

  8. def open(self):

  9. self._open(self.base_url)

  10. def search_content(self,content):

  11. # 调用父类的find_emelemt,然后将本类的参数传入

  12. content1 = self.find_emelemt(*self.search_loc)

  13. content1.send_keys(content)

  14. def btn_click(self):

  15. btn1 = self.find_emelemt(*self.btn_loc)

  16. btn1.click()

TestCase类:

  1. from unittest import TestCase

  2. import unittest

  3. from selenium import webdriver

  4. from time import sleep

  5. from SeleniumProject.PO.Search import SearchPage

  6. class CaseRun(TestCase):

  7. def setUp(self):

  8. self.driver = webdriver.Chrome()

  9. sleep(3)

  10. self.url = "https://cn.bing.com/"

  11. sleep(3)

  12. self.content = "墨菲特"

  13. # 测试步骤

  14. def test_search(self):

  15. bing_page = SearchPage(self.driver,self.url)

  16. bing_page.open()

  17. sleep(3)

  18. bing_page.search_content(self.content)

  19. sleep(3)

  20. bing_page.btn_click()

  21. sleep(3)

  22. def tearDown(self):

  23. self.driver.quit()

  24. if __name__ == "__main__":

  25. unittest.main()

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

          视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

  • 19
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值