python web自动化(关键字驱动与POM)

1.关键字驱动解析

        所谓的关键字驱动,本质就是函数封装的过程。

       ⾃动化当中的封装⽬的是:拆分重复的⾏为代码和测试数据,增加可维护性和复⽤性

                我们想要定义一个工具类        


# 定义工具类(基于基础的方法,进行的关键字封装)
class WebKeys:# 这个里面可以封装很多的web自动化的方法# 通过构造函数,来接受driver对象def __init__(self, driver):  # driver是为了后面再用的时候,传入浏览器的对象# 浏览器的初始化self.driver = driver# 打开项目地址def open(self, url):self.driver.get(url)"""# 元素定位的方式一:driver.find_element(By.ID, "txtUName").send_keys("17798989898")# 元素定位的方式二:driver.find_element("id", "txtUName").send_keys("17798989898")"""# 元素定位def locator(self, method, value):# 引用for循环,去循环判断是否定位元素成功# 获取原始的元素之后,再去获取他里面的动态熟悉el = self.driver.find_element(method, value)# 将定位的元素标记出来self.locator_station(el)return el# 把定位到的元素,标记颜色def locator_station(self, el):self.driver.execute_script("arguments[0].setAttribute('style',arguments[1]);",el,"border: 2px solid red;"  # 边框、red红色、green绿色)

再之后,我们新建conftest文件,用来运行前置后后置对象

        

""""""
import pytest
from selenium import webdriver@pytest.fixture
def browser():# 01 用例的前置操作driver = webdriver.Chrome()# 02 用例执行,返回driveryield driver# 03 用例的后置操作,关闭浏览器driver.quit()

然后我们就可以开始写测试用例

        

""""""
import time"""关键字封装之前的测试用例写法
"""# def test_login01(browser):  # 因为browser现在就是返回的driver对象
#     # 准备测试数据
#     username = "17798989898"
#     password = "123456"
#
#     # 打开项目地址
#     browser.get("http://novel.hctestedu.com/user/login.html")
#
#     # 进行登录操作
#     browser.find_element("id", "txtUName").send_keys(username)  # 输入账号
#     browser.find_element("id", "txtPassword").send_keys(password)  # 输入密码
#     browser.find_element("id", "btnLogin").click()  # 点击登录"""关键字封装之后的测试用例写法
"""from day9.p01_关键字驱动解析.key_word.key_cncap import WebKeysdef test_login02(browser):  # 因为browser现在就是返回的driver对象# 准备测试数据username = "17798989898"password = "123456"# 初始化工具类wk = WebKeys(browser)# 打开项目地址# browser.get("http://novel.hctestedu.com/user/login.html")wk.open("http://novel.hctestedu.com/user/login.html")# 进行登录操作# browser.find_element("id", "txtUName").send_keys(username)  # 输入账号# browser.find_element("id", "txtPassword").send_keys(password)  # 输入密码# browser.find_element("id", "btnLogin").click()  # 点击登录wk.locator("id", "txtUName").send_keys(username)  # 输入账号wk.locator("id", "txtPassword").send_keys(password)  # 输入密码time.sleep(3)wk.locator("id", "btnLogin").click()  # 点击登录

2.数据驱动与数据分离--yaml⽂件驱动

                数据驱动类型⽀持:

                将测试过程中所有测试数据,进⾏提取、保存以及管理,提升框架的可维护性⽀持:                    Excel、Yaml、JSON、Py.....

                yaml数据驱动
                        安装依赖包:pip install pyyaml -i https://mirrors.aliyun.com/pypi/simple/

                yaml⽂件写法: ' - ' 表示 list标签' : ' 表示dict标签

                     准备数据:        

# data.userData.yaml
-
username: 18894687777
passwd: 123456
-
username: 13995245568
passwd: 123456
-
username: 14713374348
passwd: 123456

        读取yaml数据

        

# data_driver.yaml_driver.py
import yaml
def load_yaml(path):
file = open(path, 'r', encoding='utf-8')
data = yaml.load(file, Loader=yaml.FullLoader)
return data

测试yaml⽂件读取

# data_driver.yamlReadTest.py
from data_driver.yaml_driver import load_yaml
content = load_yaml('../data/userData.yaml')
print(content)

动态化测试⽤例的⽣成与断⾔数据的⽣成:

        

""""""
import timeimport pytest
from day9.p02_数据驱动与数据分离.data_driver.yaml_driver import load_yaml
from day9.p01_关键字驱动解析.key_word.key_cncap import WebKeys@pytest.mark.parametrize("data", load_yaml(r"./data/userData.yaml"))
def test_login02(browser, data):  # 因为browser现在就是返回的driver对象# 准备测试数据print("data: ", data)username = data['username']password = data['password']# 初始化工具类wk = WebKeys(browser)# 打开项目地址wk.open("http://novel.hctestedu.com/user/login.html")# 进行登录操作wk.locator("id", "txtUName").send_keys(username)  # 输入账号wk.locator("id", "txtPassword").send_keys(password)  # 输入密码time.sleep(3)wk.locator("id", "btnLogin").click()  # 点击登录

 我们在data中放入三三个数据,通过这种方式,我们可以一口气执行将三个账户都执行测试用例

3.POM封装思想解析

含义:POM(Page Object Model)的主要⽬标是将测试代码和⻚⾯对象的实现代码分离,以提⾼测试代码的可维护性和可读性
       PO设计模式具有以下优点:

        PO就是,以每个⽹⻚或者⽹⻚中的组件为单位,进⾏⾃动化代码的维护,可以和关键字驱动结合起来,进⼀步提⾼代码的 可维护性复⽤性

                封装业务流程模块

                        

""""""
import timefrom selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as ecfrom day9.p04_POM优化元素定位分离.key_word.key_cncap import WebKeys"""封装登录的方法(因为很多用例都需要登录)实际的项目中,这个板块(page模块)是要结合项目的实际情况的
"""class LoginPage(WebKeys):# 登录方法def login(self, url, username, password):# 打开项目地址self.open(url)# 进行登录操作self.locator("id", "txtUName").send_keys(username)  # 输入账号self.locator("id", "txtPassword").send_keys(password)  # 输入密码time.sleep(3)self.locator("id", "btnLogin").click()  # 点击登录# 判断是否登录成功wait = WebDriverWait(self.driver, 5)# 根据首页是否会出现username作为判断条件wait.until(ec.text_to_be_present_in_element(("xpath", '//*[@id="headerUserInfo"]/span/a[1]'), str(username)))

隔离测试数据(VRA)

        

"""""""""把那些全局的变量,都可以写在这里(通过大小写区分是全局的,还是局部的)
"""
LOGIN_URL = "http://novel.hctestedu.com/user/login.html"
HOME_URL = "http://novel.hctestedu.com/?m=2"

4.POM优化:元素定位分离

                问题:⻓流程复杂业务,⻚⾯元素封装界定不清

                ⽅案:将⻚⾯元素抽离出来,集中管理,加编号加前缀,⽅便搜索查找,避免重复

                封装元素定位属性模块(locate):

                

"""""""""元素定位的方法和值
""""""登录页面的元素
"""
username_el = ["id", "txtUName"]  # 输入账号
password_el = ["id", "txtPassword"]  # 输入密码
login_el = ["id", "btnLogin"]  # 点击登录"""首页的元素
"""
home_login_el = ["xpath", '//*[@id="headerUserInfo"]/span/a[1]']"""作家专区的元素
"""

元素定位属性封装后的登录模块封装示例:

        

""""""
import timefrom selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
from day9.p04_POM优化元素定位分离.locate.allPages import *
from day9.p04_POM优化元素定位分离.key_word.key_cncap import WebKeys"""封装登录的方法(因为很多用例都需要登录)实际的项目中,这个板块(page模块)是要结合项目的实际情况的
"""class LoginPage(WebKeys):# 登录方法def login(self, url, username, password):# 打开项目地址self.open(url)# 进行登录操作self.locator(username_el[0], username_el[1]).send_keys(username)  # 输入账号self.locator(password_el[0], password_el[1]).send_keys(password)  # 输入密码time.sleep(3)self.locator(login_el[0], login_el[1]).click()  # 点击登录# 判断是否登录成功wait = WebDriverWait(self.driver, 5)# 根据首页是否会出现username作为判断条件wait.until(ec.text_to_be_present_in_element((home_login_el[0], home_login_el[1]), str(username)))

5.知识补充(eval函数的使⽤):

        官⽅解释:将字符串str当做有效的表达式来求值并返回计算结果

        

a = "[[1, 2], [3, 4], [5, 6]]"
# print(type(a))
# print(type(eval(a)))
# print(eval(a))
# print(eval(a)[0])b = "{'a': 1, 'b': 2}"
print(type(b))
print(type(eval(b)))
print(eval(b))
print(eval(b)['a'])

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/839431.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

echarts全局设置饼图的颜色

🌷第一步 在js文件中写入你需要的颜色 这里的颜色也可以写渐变的 🌷下一步 在main.is中引用全局挂载 🌷最后一步 在初始化的时候加一个macarons即可 🌷第一步 在js文件中写入你需要的颜色 这里的颜色也可以写渐变的 (functi…

探索k8s集群中kubectl的陈述式资源管理

一、k8s集群资源管理方式分类 1.1陈述式资源管理方式:增删查比较方便,但是改非常不方便 使用一条kubectl命令和参数选项来实现资源对象管理操作 即通过命令的方式来实 1.2声明式资源管理方式:yaml文件管理 使用yaml配置文件或者json配置文…

【研发日记】嵌入式处理器技能解锁(一)——多任务异步执行调度的三种方法

文章目录 前言 Timer中断调度 Event中断调度 StateFlow调度 分析和应用 总结 参考资料 前言 近期在一些嵌入式系统开发项目中,在使用嵌入式处理器时,遇到了挺多费时费力的事情。所以利用晚上和周末时间,在这些方面深入研究了一下&…

全文索引-FullText

一、数据结构 倒排索引:存储单词与文档的映射 1、正向索引 正向索引结构如下: 文档1的ID→单词1的信息;单词2的信息;单词3的信息… 文档2的ID→单词3的信息;单词2的信息;单词4的信息… 2、反向索引 反向索引结构如…

AWS安全性身份和合规性之Inspector

Amazon Inspector 是一项漏洞管理服务,可持续扫描您的 AWS 工作负载,以查找软件漏洞和意外网络泄露。Amazon Inspector 会自动发现和扫描正在运行的亚马逊 EC2 实例、亚马逊弹性容器注册表 (Amazon ECR) Container Registry 中的容器映像,以及…

Joomla 3.7.0 (CVE-2017-8917) SQL注入漏洞环境

1 漏洞概述 Joomla是一个基于PHP的内容管理系统(CMS),广泛应用于各类网站。2017年,Joomla 3.7.0版本被发现存在SQL注入漏洞(CVE-2017-8917),攻击者可以利用该漏洞对数据库进行未授权查询或操作…

前端常用的状态码

常用状态码 常用状态码大家可以记一下,所有的也记不住,简洁几个字概括一下,方便大家进行记忆。 200 OK:请求成功 401 Unauthorized:未授权,未登录 403 Forbidde:已登录,但是对于…

The Sandbox 和 Bitkub 联手增强东南亚元宇宙中心

作为去中心化游戏虚拟世界和区块链平台的先驱,The Sandbox 正与泰国领先的区块链网络 Bitkub Blockchain Technology Co., Ltd. 展开创新合作。双方合作的目的是将Bitkub元宇宙的影响力扩展到The Sandbox,建立一个元宇宙中心,向用户承诺从 Bi…

C# GetManifestResourceStream 获取项目资源为null解决方案(亲测)

GetManifestResourceStream 获取项目资源为null 使用Stream s assembly.GetManifestResourceStream(Assembly.GetExecutingAssembly().GetName().Name resourceName) 获取资源文件,返回流为null,如图所示: 解决方案 设置资源文件的 属性&…

centos服务器常用清理脚本分享

做开发时,经常遇到服务器监控报警,日志占据大量的磁盘空间,需要清理。每次手动清理很麻烦。这里分享一些定时清理的脚本,减轻运维的工作量。将sh脚本与crontab定时任务结合,实现定时清理。 nacos日志清理脚本 nacos也…

WPF--几种常用定时器Timer汇总

1.WPF中常用4种Timer: System.Windows.Threading.DispatcherTimer(UI操作线程) 这是一个基于WPF Dispatcher的计时器。它可以在指定的时间间隔内触发Tick事件,并在UI线程上执行回调函数,方便进行UI更新操作。 System.Timers.Timer 这是一个基…

<MySQL> 【数据类型】

目录 一、数据类型一览 二、整型 (一)INT (二)BIT 三、浮点数 (一)FLOAT (二)DECIMAL (三)如何选择 四、字符 (一)CHAR &a…

超简单白话文机器学习 - 支持向量机SVM(含算法讲解,公式全解,手写代码实现,调包实现)

1. 支持向量机SVM 支持向量机,因其英文名为support vector machine,故一般简称SVM,通俗来讲,它是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化&#xff…

Redis教程(十四):Redis的三主三从集群搭建

Redis集群 Redis的集群是一种允许多个Redis节点在网络上互联并协作的技术,它为处理大规模数据提供了更高的性能和可扩展性,同时具有数据高可用性和故障容忍性。 以下是Redis集群的一些主要特性: 数据分片 在Redis集群中,数据会被分成多个部分,每个部分在不同的Redis节…

优雅草便民工具v2.0.4更新

优雅草便民工具v2.0.4更新 优雅草便民工具v2.0.4更新 2024年5月20日v2.0.4更新优雅草便民工具youyacao-tools-增加淘宝联想词功能和ai绘画功能apk下载 https://fenfacun.youyacao.com/tools204.apk 介绍 优雅草便民工具是一款由成都市一颗优雅草科技有限公司打造的便民查询公益…

JVM(8):虚拟机性能分析和故障解决工具之jinfo工具

1 jinfo(Configuration Info forJava)作用 实时地查看和调整虚拟机各项参数 2 命令格式 jinfo [options] 参数解释: 第一个参数:options no option:输出全部的参数和系统属性-flag name:输出对应名称的参数-flag [|-]name&am…

6. Spring面试题汇总

Java全栈面试题汇总目录-CSDN博客 1. 什么是Spring框架? Spring是一种轻量级开发框架,旨在提高开发人员的开发效率以及系统的可维护性。 我们一般说Spring框架指的都是Spring Framework,它是很多模块的集合,使用这些模块可以很方便地协助…

如何轻松访问 Android 手机和平板电脑上的内部存储

概括 在数字设备领域,我们的智能手机充当虚拟金库,在其范围内存储个人数据、珍贵记忆和重要信息的宝库。因此,我们将指导您如何访问 Android 上的内部存储,确保您可以安全、轻松地检查内部文件系统并管理文件。同时,您…

无人机监测系统:天空之眼,精准掌握地球脉动

在当今信息化快速发展的时代,无人机技术以其独特的优势,正在成为资源调查、环境监测和规划支持的重要工具。无人机监测系统通过搭载多种传感器和设备,能够快速、高效地获取地表信息,为决策提供科学依据。 项目背景 随着全球环境…

Llama 3 CPU推理优化指南

备受期待的 Meta 第三代 Llama 现已发布,我想确保你知道如何以最佳方式部署这种最先进的 (SoTA) LLM。在本教程中,我们将重点介绍如何执行仅权重量化 (WOQ) 来压缩 8B 参数模型并改善推理延迟,但首先,让我们讨论一下 Meta Llama 3…