基于Python+Pytest+Selenium的自动化测试之PO模式简介

在实际的软件研发过程中,往往会存在项目时间紧张、待测工作量大,待测的功能点较多,但是团队测试人员有限,难以全部测试覆盖的问题。针对问题,我们可以通过自动化测试去解决一些测试工作中遇到的实际问题,把一些工作写成代码,交给机器去处理和执行,解放测试人员,让代码帮助人去执行测试,从而达到提升测试效率的目的。而以低成本的方式选择合适的自动化测试框架,并且在项目中解决一些实际问题,就显得尤为重要。
本文结合笔者的一些实践,将基于Python+Pytest+Selenium的自动化测试实践简要总结,做一些介绍。
![在这里插入图片描述](https://img-blog.csdnimg.cn/ce7b646753ce4ff18527d12a4eef1dd3.png
一、Selenium介绍
◆Selenium无疑是当下主流的自动化测试工具之一,尤其在Web UI功能测试领域,有极其出色的表现。那么最主要的原因之一,当然是开源!它主要是用于Web 应用程序的自动化测试,但不只局限于此,同时支持所有基于web 的管理任务自动化

◆当客户端(Client)测试脚本启动浏览器驱动(driver)时,Selenium WebDriver会启动相应的浏览器,启动完成后,WebDriver会将浏览器绑定到特定端口形成一个浏览器实例,测试脚本创建session通过HTTP请求向远程控制服务器(Remote Server,简称RS)发送请求,由RS进行解析并完成相应操作并返回结果
在这里插入图片描述

二、环境要求
◆Python:3.0以上版本
◆安装selenium:pip3 install selenium
◆安装Chrome浏览器及chromedriver(放在python的主目录中)
三、基于python使用pytest+selenium框架下PO模式测试框架
1、PO模式简介
◆Page Object Model 页面对象模型,用来管理维护一组页面元素的对象库
◆在PO下,应用程序的每一个页面都有一个对应的Page类
◆每一个Page类维护着该页面的元素集和操作这些元素的方法
在这里插入图片描述
在这里插入图片描述

2、PO模式解读

官网:https://github.com/SeleniumHQ/selenium/wiki/PageObjects

  1. The public methods represent the servives that the page offers
    ◆使用公共方法来代表页面提供的服务
    ◆基类(基础服务:页面的基础的操作:点击元素、输入内容等)
    ◆页面类:登录,不同页面中增删改查等方法
  2. Try not to expose the internals of the page
    ◆避免暴露页面的内部细节,比如元素定位值、元素的定位方法等,隔离测试用例与业务层面和页面对象
  3. Generally don’t make assertions
    ◆PO本身通常不应进行判断或断言,判断和断言为测试的一部分,应始终在测试的代码内,而不是在PO中,PO用来包含页面的表示形式,以及页面通过方法提供的服务,但是与PO无关的测试代码不应包含其中
  4. Methods return other PageObjects
    ◆方法返回其他页面对象,进行页面间的关联
    例如:登录→首页 首页→其他页面。
  5. Need not represent an entire page
    ◆PO不一定需要代表整个页面,定义所需要实现的业务部分,也可用于表示页面上的组件,若在自动化测试的页面中包含多个组件,每个组件都有单独的页面对象,可提高可维护性
  6. Different results for the same action are modelled as different methods
    ◆相同的操作(不同的数据)带来的不同的结果可以封装为不同的方法
    3、项目架构

◆common:公共模块,如基类、定位器、浏览器
◆configs:项目配置等
◆docs:项目文档
◆outFiles:logs、reports、screenshots
◆pageObject:页面对象
◆testCases:测试用例
◆testDatas:测试数据
◆utils:工具模块

4、基类的封装

◆获取浏览器方法get_driver()
◆通过参数控制浏览器的默认类型(兼容性测试)
◆通过参数控制浏览器的模式,有头/无头
◆通过参数控制隐式等待时间
◆单例实现(参数化登录用例避免打开多个页面后进行)
◆元素定位:存储在yaml文件中
以类名区分页面,将对应页面元素定位存储在类名下,在basePage中定义不同页面对应不同元素
◆操作页面元素方法:

  1. 定位单个元素get_element
  2. 定位多个元素get_elements
  3. 在元素上输入文本(添加清除已有内容)
  4. 点击元素
  5. 获取单个元素文本(添加异常保护)
  6. 获取多个元素文本
  7. 点击元素加入等待时长(需要在页面刷新/切换等场景下使用)

5、操作层pageObject

  1. loginPage:定义打开页面、登录页面方法→返回mainpage页面类
  2. mainPage:定义主页面进入到不同页面中的方法
    →不同页面类返回当前页面类
  3. otherPage:其他页面类,类中包含功能方向操作方法

6、业务层——测试用例

  1. 将文件、数据存储在yaml文件或excel表格中

  2. 利用数据驱动获取数据并传参

  3. 编写测试用例,可用allure.step添加测试步骤说明

  4. 进行断言,验证所有的测试结果是否符合预期结果
    7、生成报告

  5. 在cmd中pip install allure

  6. 在测试用例中import allure、import os

  7. 运行时添加生成测试报告用例pytest.main([‘-sv’, ‘–alluredir’, ‘./report’])

  8. 可指定报告存储的位置,例如存储在当前文件夹中:
    os.system(‘allure generate ./report -o ./report/report --clean’)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python+Selenium+pytest+PO模式是一种常用的Web UI自动化测试框架,下面是一些基本的步骤: 1. 安装pytestSelenium:使用pip install pytest selenium命令进行安装。 2. 创建pytest测试用例:创建一个py文件,使用pytest框架编写测试用例,可以使用Selenium进行web页面的操作和数据的验证。 3. 创建PO模式的页面对象:使用Page Object模式构建页面对象,将页面的元素和操作封装在一个类中,方便管理和维护。 4. 运行pytest测试:使用pytest运行测试用例,并查看测试报告。 5. 使用pytest插件:pytest提供了许多插件,例如pytest-html、pytest-xdist等,可以用来生成HTML测试报告、运行分布式测试等。 下面是一个简单的示例代码: ```python # conftest.py文件 from selenium import webdriver import pytest @pytest.fixture(scope='module') def driver(): driver = webdriver.Chrome() yield driver driver.quit() # test_login.py文件 from pages.login_page import LoginPage def test_login(driver): login_page = LoginPage(driver) login_page.open() login_page.input_username('test') login_page.input_password('test123') login_page.click_submit() assert login_page.get_login_result() == '登录成功' # login_page.py文件 from selenium.webdriver.common.by import By class LoginPage: url = 'http://localhost/login' def __init__(self, driver): self.driver = driver def open(self): self.driver.get(self.url) def input_username(self, username): self.driver.find_element(By.ID, 'username').send_keys(username) def input_password(self, password): self.driver.find_element(By.ID, 'password').send_keys(password) def click_submit(self): self.driver.find_element(By.ID, 'submit').click() def get_login_result(self): return self.driver.find_element(By.ID, 'result').text ``` 在上面的示例中,我们使用了pytest的fixture机制来管理WebDriver对象的生命周期,使用PO模式的页面对象来封装登录页面的元素和操作。我们可以通过执行pytest test_login.py命令来运行测试,并生成测试报告。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值