新网站怎么做外链,国外响应式网站,东莞网站营销,水果网络营销策划书为什么要用POM设计模式
前期#xff0c;我们学会了使用PythonSelenium编写Web UI自动化测试线性脚本
线性脚本#xff08;以快递100网站登录举栗#xff09;#xff1a;
import timefrom selenium import webdriver
from selenium.webdriver.common.by import Bydriver …为什么要用POM设计模式
前期我们学会了使用PythonSelenium编写Web UI自动化测试线性脚本
线性脚本以快递100网站登录举栗
import timefrom selenium import webdriver
from selenium.webdriver.common.by import Bydriver webdriver.Chrome()driver.get(https://sso.kuaidi100.com/sso/v2/authorize.do)
driver.maximize_window()
driver.find_element(By.ID, name).send_keys(***********)
driver.find_element(By.ID, password).send_keys(***********)
driver.find_element(By.ID, submit).click()
time.sleep(2)
text driver.find_element(By.PARTIAL_LINK_TEXT, 首页).text
assert text 首页
driver.close()使用以上代码最基础最简单的Web UI 自动化测试就做起来了但是问题也随之而来线性脚本的缺点也暴露出来了
Web UI自动化测试简单来说就是模拟人在浏览器上的操作打开浏览器-定位元素-操作元素-模拟页面动作-断言结果由于线性脚本中的元素定位、元素操作细节、测试数据、结果验证断言是捆绑在一起的代码会显得非常冗余、可读性差、不可复用、工作量大且可维护性差刚开始少数的测试用例维护起来可能很容易但随着时间迁移、产品迭代、测试套件持续增长脚本也越来越臃肿可能需要维护几十个页面且很多页面是公用的元素的任何改变都会让我们的脚本变得繁琐复杂、耗时易出错。例如十几个用例中都用到了A元素某一天A元素被前端改成了B元素我们就需要去十几个用到A元素的地方将A元素修改为B元素如果可以把公共元素抽取出来即使元素被前端修改我们也只需更新元素的定位方式而不用修改每条测试用例无论多少用例用到该元素都只需修改元素定位方式重新获取元素即可所以我们引入了PageObject这种解决方案它可以帮我们解决设计上的问题可以将testcase和page分层形成一个非常好的结果
什么是POM设计模式 POMPage Object Model页面对象模型的简称 2013年由Martin Fowler提出了PageObject的观点 作者的观点是一种封装思想旨在为每个待测页面创建一个页面对象从而将繁琐的定位操作、操作细节封装到这个页面对象中对外只提供必要的操作接口在调用的时候只调用提供的接口不用去调用操作细节最终实现程序的高内聚低耦合使程序模块的可重用性、移植性大大增强 在这种模式下对于应用程序中的每个页面都应该有相应单独的页面类例如login_page、userinfo_page类中应该包含此页面上的元素对象和操作这些元素对象所需要的方法 再将流程所关联的页面作为对象将对象串联起来形成不同的业务流程例如在登录页面完成登录操作后跳转到用户中心页面进行个人信息的修改
Selenium官方对PageObject的引入
历史 2015年Selenium官方对PageObject进行引入 PageObjects · SeleniumHQ/selenium Wiki · GitHub 2020年Selenium更新文档地址 Page object models | Selenium
PageObject六大原则 The public methods represent the services that the page offers 用公共方法表示页面提供的服务 例如登录页面有用户名输入框、密码输入框、登录按钮于是就可以用input_username()代表输入用户名、用input_password()代表输入密码、用click_submit()代表点击登录按钮 Try not to expose the internals of the page 尽量不要暴露页面的内部信息 将操作细节封装成方法对外只提供对应的方法供调用 Generally don’t make assertions 一般不使用断言 断言要和Page代码分开不要将断言写在PageObject层 Methods return other PageObjects 方法返回其他PageObjects 例如首页有个方法是点击登录图标跳转到登录页面因此这个方法应该返回login_page Need not represent an entire page 不需要表示整个页面 不需要对页面中的每一个元素进行建模只需要关注我们需要用到的元素。例如登录页面除了账号密码登录还有快捷登录、手机短信登录、扫码登录等 Different results for the same action are modelled as different methods 同一行为的不同结果可以用不同的方法来模拟 例如对一个页面进行操作可能出现正确的结果或者错误的结果可以为这两种不同的结果分别创建两个不同的方法
POM框架
GitHub开源代码 basebase_page基类定义项目所需的基础方法对Selenium一些常用的api进行二次封装如find_element、click、send_keys、screenshot、调用JavaScript脚本的方法以及其他与浏览器相关的操作 为什么要有基类 由于每个页面都会频繁使用这些方法若单纯使用Selenium原始api可能遇到一些问题例如某个按钮未加载完成但已触发了点击事件导致元素定位不到而报错。这时就可以对原始api进行二次封装如加入等待时间、对异常进行捕获并打印日志等之后所有的PageObject都继承BasePage类后续只需要调用这些封装好的方法增强复用性假设以后不使用Selenium这个框架就只需要修改BasePage中的方法不用去修改具体的测试用例业务代码 pagespage_object页面对象层也是PO的核心层继承BasePage管理页面元素以及操作元素的方法将操作元素的动作写成方法 cases测试用例层用于管理测试用例这里会用到单元测试框架如Pytest、Unittest。 data测试数据层用于测试数据的管理数据与脚本分离降低维护成本提高可移植性如yml 文件数据 config配置文件层存放整个项目需要用到的配置项如URL、数据库信息等 utilsCommonUtil公共模块将一些公共函数、方法以及通用操作进行封装如日志模块、yaml 操作模块、时间模块等 run.py批量执行测试用例的主程序根据不同需求不同场景进行组装遵循框架的灵活性和扩展性 logs日志模块用于记录和管理日志针对不同情况设置不同的日志级别方便定位问题 reports测试报告层用于测试报告的生成和管理如基于 Allure 生成的定制化报告 字节大牛十分钟讲清App自动化测试POM框架深度封装全程高能