• 13
  • 13
分享
  • 减轻自动化维护小Tip:页面对象模型的妙用——软件测试圈
  • 曼倩诙谐 2021-08-02 11:39:58 字数 2739 阅读 2175 收藏 13

  无论自动化或手工测试其主要目的都是为了持续提高产品的质量,无论企业的项目采取哪种软件开发模型, 自动化测试早已成为当下测试过程中不可或缺的一部分,增加自动化测试覆盖率也已被企业视为衡量测试团队效率的关键绩效指标(KPI)之一。

  今天我们就来聊一聊Web自动化测试中的页面对象模型(POM),开启你对它的认知,探访POM是如何通过减少代码重复来有效减轻自动化维护的工作。

  1. 页面对象模型(POM)攻略

  页面对象模型是一种设计模式,其核心重点是通过减少代码重复,进而达到最小化代码更新/维护中涉及的工作量。 基于页面对象模型(POM)的实现包含以下关键要素:

  (1) 页面类(Page Class/Page Object):

  —— 包含被测页面中页面元素(WebElements)对象的存储库;

  —— 包含针对这些页面元素(WebElements)执行操作的实现;

  (2) 测试用例(Test Cases):

  —— 包含实际测试场景,测试步骤的实现;

  —— 通过页面类(Page Class)中的方法与页面元素(WebElements)进行交互;

  —— 当页面元素(WebElements)发生更改,仅需要更新页面类(Page Class),测试代码保持不变;

  2. 线性脚本测试用例Demo

  我们以“当当网”高级搜索为例,通过Selenium Python + unittest进行线性脚本测试用例展示。

  【测试场景】

  (1)通过Chrome浏览器,打开“当当网”高级搜索页面

  (2)定位到“数字商品”Tab

  (3)输入相关查询词条

  (4)执行搜索

  (5)关闭浏览器

图片 1.png

  【测试脚本实现】

  (1)相关库的导入

图片 2.png

  (2)创建测试用例

  到此,该场景的自动化测试脚本编写完成。显而易见,这属于中规中矩的自动化测试脚本,其中setUp和tearDown分别用于做浏览器驱动的初始化和关闭,test_DangDangSearch用来执行搜索查询相关的测试步骤。

图片 3.png

图片 4.png

图片 5.png

  3. 页面对象模型(POM)实现Demo

  通过观察后不难发现,当被测页面上任意一个元素发生变更时,我们需要对整个测试用例进行更新,如果这样的测试用例有几十个,甚至于几百个呢,难不成一个个脚本更新吗?这样做未免效率太低了,自动化测试的优势将直接变成了劣势。

  所幸的是,页面对象模型(POM)设计给我们带来了解决方案。下面我们将通过引入页面对象模型(POM),对上述线性自动化测试脚本进行优化。

  【测试场景】

  同上。

  【分析与设计】

  (1)为了将上面的线性测试脚本移植到Selenium Python的页面对象模型中,我们将约定遵循一个目录结构,后续无论项目规模和复杂程度如何,都可以将该目录结构视作模板进行扩展;

  (2)目录结构的选择取决于测试需求,测试复杂性以及整个研发测试团队的经验;

  (3)根据以上条件,我们可以得出如下目录结构:

图片 7.png

  根据约定的目录结构,在Pycharm中我们新建如下项目:

图片 9.png

  【应用PO模式的脚本实现】

  (1)元素定位器

  如上图结构所示,目录Project-Directory \ PageObject包含Locators.py,其中根据需要添加了元素定位方式,具体代码实现如下:

  ·Src-----PageObject-----Locators.py

图片 10.png

  由于元素定位方式是根据被测页面添加的,因此后续如有任何关于元素定位方式的变更只需要在Locators.py文件中做相应的更改即可,其他项目文件不会受到影响。

  (2)被测页面Page

  该文件用到了Locators.py中定位的元素,并实现了Locators.py中相关元素的操作,具体代码实现如下:

  ·Src-----PageObject-----Pages-----SearchPage.py

图片 11.png

图片 12.png

图片 13.png

  (3)Web驱动初始化

  为了提高代码的可管理性和可移植性,我们将Selenium Webdriver初始化设置与测试套件和测试用例分开存放;

  如果后续计划使用其他Web驱动程序执行测试时,仅需要在WebDriverSetup.py文件中进行更改即可,其余项目文件的实现保持不变。

  下面是Selenium Webdriver的setUp和tearDown方法在WebDriverSetup.py文件中的统一实现。

  ·Src-----TestBase-----WebDriverSetup.py

图片 15.png

  使用页面对象模型(POM)最终目的是为了最大程度地减少重复代码的百分比,并使代码更具可移植性。

  我们通常会将实现划分为以下3部分:

  ·定位符Locators,页面Pages(基于被测网页)

  ·测试脚本(即测试用例,基于被测网页)

  ·测试套件(测试用例的汇总)

  (4)测试用例

  目前我们已经准备好了WebDriver设置和所需被测页面的实现,接下来就是测试用例的脚本编写了。

  下面是“当当网”高级搜索查询功能的测试用例脚本实现,该脚本使用了目前为止已完成的测试基础结构(“定位器Locator+页面Page”)。

  ·Test ----- Scripts ----- test_Home_Page.py

图片 16.png

  ·Test ----- Scripts ----- test_DangDang_Search.py

图片 17.png

图片 18.png

  由上述测试用例可见, 我们首先创建了Search类的实例,以便于在后续部分中使用该实例的属性及方法,以下方法是在当当高级搜索页面种进行的操作:

  ·tab.click()

  ·bookname.send_keys()

  ·ISBN.send_keys()

  ·author.send_keys()

  ·publisher.send_keys()

  ·submit.click()

  (5)测试用例套件触发器

  用例套件触发器用于加载测试用例到测试套件后,再批量启动执行。具体代码实现如下:

  ·Test ----- TestSuite -----TestRunner.py

图片 20.png

  4. 总结

  页面对象模型(Page Object Model)使测试代码更易于维护,并最大程度地减少项目/产品中的代码重复率。因此,无论Web应用程序亦或是网页中UI是否频繁更改,测试与开发团队都应积极探索并有效将其应用于Selenium自动化测试中。

  以上基于页面对象模型(POM)进行了详细介绍,由浅入深展示了线性自动化测试脚本经过POM改进优化的整个过程,希望能够给大家的测试工作带来帮助,感兴趣的读者不妨一试。



作者:罗狮小钉   

来源:51Testing软件测试网原创

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 配置要求:工具android:5.0以上uc-devtoolsadbChromedriver手机环境配置1.打开开发者模式(不懂的就百度),打开usb调试和安装2.在windows中打开命令行,输入adb devices,可以看到手机驱动就行了uc-devtools配置1.下载好直接安装就行了,如果安装过程中缺少什么东东文件的话,就在C盘全局搜索出来复制到安装uc-devtools的文件夹就行了2.安装完成后,需要在设置中选择本地资源3。打开我们自带的浏览器,输入百度的网址,就能够看的到我们的页面了,点击inspect查看H5页面就行了(如果看不到的话,可能是浏览器内核问题)Appium配置1...
            13 14 2877
            分享
          •   jmeter对图片验证码的处理  在web端的登录接口经常会有图片验证码的输入,而且每次登录时图片验证码都是随机的;当通过jmeter做接口登录的时候要对图片验证码进行识别出图片中的字段,然后再登录接口中使用;  通过jmeter对图片验证码的识别方法  1、通过ocrserver工具识别图片验证码  如下图:解压后双击OcrServer.exe;然后电脑的右下角会显示该服务的IP和端口。   2、在jmeter中发送获取该验证码图片的接口;如下图  3、在获取验证码图片的接口下面添加监听器》保存响应到文件;如下图:  4、再取样器中再添加JSR223 Sampler;注释一下该...
            0 0 430
            分享
          •   据报道,皮尤研究中心的一项调查显示,Twitter的用户们仍然在使用这个社交媒体平台,但自从去年年底埃隆·马斯克完成对该公司的收购后,在上面发帖的人正在变得越来越少。  当地时间周三,这份调查的作者表示:“研究中心对该网站用户实际行为的新分析发现,马斯克收购前最活跃的用户(按推文量排序为前20%的用户),在收购后的几个月里出现了明显的发帖量下降趋势。在收购完成之后,这些用户每月的平均推文数量下降了约25%。”  此外,调查显示,在过去一年中使用过Twitter的美国成年人中,约有60%的人表示他们最近已经中断了这项服务,四分之一的人表示他们一年后不会再使用Twitter。  新的数据凸显了...
            0 0 764
            分享
          •   任何新的职位刚开始的时候都是大家的技术参差不齐,只要能干,肯动脑,会计算机就可以在行业里找个饭吃,具体混成什么样,看本事吧。  随着现代科技的发展,软件测试行业要求越来越高,企业对于人员的需求比以前越来越专业,要懂什么技术,编程语言肯定是要会的,性能、安全、自动化甚至有的还要求测开等等。你也别觉得烦,这是事实。  总结的软件测试工程师发展规划路线,希望会给你带来灵感和方向:  ·测试基础,了解测试的基础技能,掌握主流缺陷管理工具的使用,熟练测试环境的操作与运维;  ·Linux必备知识,Linux作为现在最流行的软件环境系统,一定要掌握,目前的招聘要求有Linux能力;  ·Shell脚本...
            0 0 1557
            分享
          • 这篇文章,我会基于自己的一些实践经验和经历,谈谈我对单元测试的理解和观点。测试要做单元测试吗首先聊聊第一个问题:测试要做单元测试吗?我的回答:测试需要做单元测试,但要综合评估团队成员技能、个人意愿、项目迭代周期以及协作默契程度等很多因素,用合适的方法和手段在合适的时机切入,而不是一味强推。很多测试同学往往有一个误区:只要是名字带个测试,就觉得我也要做这件事,而忽略了事物的本质。比如验收测试,一般指的是QA同学经过多轮测试后,交付给产品同学来进行验收交付的产出物是否满足预期设计。比如全链路压测,很多测试同学都希望自己能主导落地,但忽略了为什么做全链路压测,怎么做,落地有哪些难点,自己能否解决,需...
            0 0 650
            分享
      • 51testing软件测试圈微信