自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(46)
  • 收藏
  • 关注

原创 报错:Element is not attached to the page document或者“error“:“stale element reference“ ……

场景:获取了元素列表,对列表里的每一个元素进行点击,第一次点击成功,第二次总是失败!原因:当前页面存在刷新 ,原来获取的元素就无效了解决:重新获取一遍元素。

2021-08-18 17:25:51 439

原创 selenium--切换alert

页面的弹出框2种:1)右键元素定位2)js弹框 – 由页面操作触发的。WebDriver提供了一个API,用于处理JavaScript提供的三种类型的原生弹窗消息Alerts警告框https://www.w3school.com.cn/tiy/t.asp?f=hdom_alertconfirm确认框与警告框不同,确认框还有取消按钮https://www.w3school.com.cn/tiy/t.asp?f=hdom_confirm3.prompt提示框还可以输入文本https://

2021-07-19 16:30:02 350 1

原创 selenium--切换iframe

当页面中包含iframe时,不能直接操作iframe中的元素,需要先切换进iframe才行iframe: html当中内嵌了另外一个html。iframe标签对当中,就是另外一个html。1)要判断你要操作的元素,是否在iframe当中。F12当中定位元素后,去看它的绝对路径当中是否有2个或2个以上的html。2)如果要操作iframe当中的元素,则必须切换到iframe当中。driver.switch_to.frame(iframe的元素识别策略3种)3种方式:index, name, o

2021-07-19 16:23:24 2306

原创 selenium切换窗口:switch_to.window(列表)

使用场景:在浏览器当中,如果在页面进行了某个操作,结果浏览器打开了另外一个新窗口(tab)。如果要操作新窗口当中的,页面元素,就需要窗口切换。从一个html当中,切换到了另外一个html1.获取当前会话浏览器的所有窗口**所有窗口句柄(列表) wins =driver.window_handles句柄的顺序:先出现的先加入列表。最后出现的,最后加入列表。新窗口:列表的最后一个!2.切换到指定窗口driver.switch_to.window(wins[-1]) #列表最后一个是最新的窗口

2021-07-15 16:26:30 9021

原创 python-selenium--三种等待方式

什么时候要等待?页面刷新过1.强制等待import timetime.sleep(2) #等待2s,执行到这一步程序就会等待2.隐性等待driver.implicitly_wait(20) #最多等20秒等什么呢? – 元素被找到。一个浏览器会话只需要调用一次。3.显性等待(等待WebDriverWait(until()/not_until()) + 条件expected_condition)from selenium.webdriver.common.by import By

2021-07-15 15:21:50 201

原创 allure报告和Jekins集成

allure与jenkins集成之后,可以直接在jenkins上,直接查看到上图的allure结果。并因为jenkins的构建记录都存在,所以可以看到历史构建曲线图,用例数的变化、通过率的变化、耗时的变化等均可查看到。1、在jenkins上安装allure插件。Step1: 去jenkins插件网站上下载allure插件最新版本:http://mirrors.jenkins-ci.org/plugins/allure-jenkins-plugin/Step2: 打开jenkins,在 插件管理 —

2021-07-08 14:39:44 238

原创 如何实现fixture共享?--conftest.py文件

1、作用域在哪些范围内的用例,可以共享我的fixture??conftest.py在哪个目录下,哪个目录下的所有用例(包括嵌套的目录)都可以共享**2、用例的角度来讲,去调用fixture,搜索顺序:**2.1 先找自己的.py模块内有没有2.2 同级目录下conftest.py当中有没有2.3 父级目录下conftest.py当有没有。。。。pytest的根目录下的conftest.py中有没有3.fixture嵌套:定义fixture的时候,参数是另外一个/多个fixtur

2021-07-05 15:08:23 161

原创 pytest--fixture的定义和调用

fixture:前置:环境准备、数据准备后置:清理工作、数据清理测试会话pytest执行测试用例的整个过程==================================================================函数实现,没有固定的名字。(unittest:名字是固定的)怎么让pytest识别为是fixture?--使用@pytest.fixture=========================================================

2021-07-01 18:10:37 243 1

原创 如何生成allure报告的及清除运行前已经存在的结果

1、安装allure命令行工具。(下载最新的)下载地址:https://repo.maven.apache.org/maven2/io/qameta/allure/allure-commandline/下载完成之后,解压到任意目录配置环境变量:allure的bin目录。比如D:\allure-2.12.1\bin在cmd当中,执行allure命令2、pytest在执行用例之后,要生成allure可以识别的测试结果文件。安装插件:pip install allure-pytest在pytest

2021-06-29 18:09:02 2284 1

原创 pytest和unittest的相同点和区别

相同点:都有如下步骤:1.编写测试用例:测试类以Test开头,用例名以test_开头。收集用例、执行用例、生成测试结果文件(html、xml)区别:pytest: 灵活unittest: 模板化1.编写测试用例pytest:类和函数都可以unittest:类,并且要继承unittest.TestCase类断言pytest: assert 表达式(True表示断言为真,False表示断言失败)unittest: self.assertXXXX()2.收集和执行测试用例1、unitt

2021-06-29 18:01:18 255

原创 字典的遍历结果 dict.keys()

遍历字典的keys,返回值是元组若想返回list1.强转2.for循环到列表里面

2021-06-25 14:40:29 428

原创 正则 re模块

import re作用:正则表达式匹配指定规则得字符串一、re常用方法1.re.findall(): 使用正则表达式。匹配字符串,返回匹配到得所有字符串(list)pattern = 正则表达式 ,string = 匹配的字符串,flags = 0 自定义一些规则,比如:不区分大小写2.re.match(): 匹配字符串开始位置得字符串,如果开始位置未匹配到会返回none3.re.search(): 匹配找到得第一个字符串,然后返回4.re.finditer(): 匹配所有的字符串,返回他们的

2021-06-17 18:06:01 68

原创 request、接口自动化、

一、requests使用接口测试要素1、url地址2、请求参数3、请求方法4、拓展获取请求头response_info.request.headers获取响应头response_info.headers响应体response_info.json()获取cookieresponse_info.cookies响应状态码response_info.status_code二、代码鉴权1、session鉴权2、token鉴权三、应用3.1 session鉴权import re

2021-05-27 11:36:50 112

原创 HTTP基础、post和get的区别、状态码

一、HTTP概念1、Hyper Text Transfer Protocol(超文本传输协议)2、用于从万维网服务器传输超文本到本地浏览器的传送协议3、HTTP协议是基于TCP的应用层协议,它不关心数据传输的细节,主要是用来规定客户端和服务端的数据传输格式,最初是用来向客户端传输HTML页面的内容。默认端口是80二、HTTP请求类【重点】1、get:获取资源2、post:提交资源【了解】3、put:修改资源4、delete:删除资源5、head:查看响应头6、options:查看支持

2021-05-21 17:53:50 346

原创 yaml配置文件

一、安装pip install pyyaml二、使用1、dict语法:通过冒号(:)做为连接符,加上空格,后面写value{‘mysql’:{‘host’:‘127.0.0.1’,‘port’:3306},‘name’:‘py39’,‘log’:[‘py39’,‘DEBUG’]}2、列表语法:通过横杠(-)做为连接符,加上空格,后面写元素字符串、数字三、特点1、使用空格,不用缩进符号2、大小写敏感3、一次性读取所有数据4、读出来就是python对象,可以直接使用5、注释:#6、

2021-05-21 15:18:48 439

原创 配置文件ini

一、配置文件:ini、yaml、python文件(django配置)实现软编码,方便修改二、配置文件使用场景项目环境切换:测试环境、开发环境、生产环境(通过修域名和端口来配置)数据库切换:host、password、db三、使用1、安装:pip install configparser2、ini文件的格式[section1]key1=val1key2=val2[section2]key3=val3key4=val4书写...

2021-05-19 18:13:06 418

原创 Logging自定义日志

项目日志:从代码里面收集过来的,用来还原用户行为日志打印原则:只打印关键信息(能够还原用户行为的关键信息)自动化测试关键信息:1、请求地址2、请求参数3、断言4、请求时间5、请求方式6、日志级别7、响应结果日志级别debug < info < warning < error < critical一、创建日志收集器:logging.getLogger(name)二、创建日志收集渠道:logging.StreamHandler()三、创建日志格式:单独创建,

2021-05-17 18:10:34 378

原创 ddt实战

步骤:需求:从excel读取测试用例 + ddt数据驱动 + 通过unittest运行测试用例 + 生成测试报告1、读取测试用例2、写测试用例3、数据驱动加载测试用例到测试套件4、测试用例执行5、对测试结果进行断言6、生成测试报告main.pyimport osimport unittestfrom BeautifulReport import BeautifulReportdir_path = os.path.dirname(__file__)suite = unittes

2021-05-17 15:16:47 211

原创 unittest测试用例和测试报告

一、单元测试框架:unittest(python自带的),pytest(第三方库)编写测试用例—收集测试用例—执行用例—生成测试结果二、编写测试用例1、创建测试类:类名称建议以Test开头,必须继承unittest.TestCaseclass TestLogin(unittest.TestCase):2、测试用例:2.1、必须写在测试类里面2.2、函数名称必须是test开头2.3、执行顺序,按照ASCII码顺序执行2.4、执行器配置:File—setting—tools—Python

2021-05-12 17:46:19 1595

原创 登录练习(for循环、类、函数、excel读取和写入)

1.main.pyfrom demo16testMmethod import *import astif __name__ == '__main__': #创建excel类实例 excel = HandleEcxel(workbook='testCase.xlsx', sheet='sheet1') #读取excel 测试数据 case_datas = excel.get_data_dict() #创建登录类实例 login = LoginCase

2021-05-12 10:31:43 169

原创 Excel 基本操作

一、excel操作1、编写测试用例(跟功能测试一样,正常,异常)2、读取测试用例(excel)3、发请求 (requests)4、获取响应结果 (获取接口返回数据)5、和预期结果进行比对(断言) (实际结果与预期结果比对)6、保存测试结果 (获取断言结果再保存)workbook: 工作簿,一个excel文件包含多个sheet。worksheet:工作表,一个workbook有多个,表名识别,如“sheet1”,“sheet2”等。cell: 单元格,存储数据对象二、openpyxl

2021-05-07 18:01:42 343

原创 多态

1.同名方法在不同类中,实现得功能不一样class A: def test01(self): print('吃饭')class B: def test01(self): print('睡觉')def C(obj): obj().test01()if __name__ == '__main__': C(B)2.子类继承父类,调用父类同名的方法调用父类的方法:(子类里面)self.方法名()(子类外面)类实例.方法名()

2021-04-26 17:30:42 70

原创 动态设置类属性、实例属性

1.获取对象的属性可以获取类和类实例的属性:类/类实例.__dict__2.设置属性(若属性已经存在就是修改,若不存在就是添加)setattr(cl,‘sex’,‘男’)第一个参数:对象(类或者类实例)第二个参数:属性名称第三个参数:属性的值(添加到内存里面)3.属性值获取getattr(cl,‘name’,‘default value’)第一个参数:对象(类或者类实例)第二个参数:属性名称第三个参数:默认值(当属性不存在的时候,会返回这个默认值)4.属性判断hasattr第

2021-04-26 16:59:43 472

原创 类属性、实例属性;继承;类方法、实例方法、静态方法

一、概念1.类:拥有相同属性和功能的对象的集合2.对象:是类的实体3.封装:隐藏了对象的属性和实现细节,只是对外提供接口或入口4.类的创建:class 类名称:class 类名称()5.类属性:定义在类里面,在方法(函数外面)的属性访问:类名称.类属性名称可以直接访问,不需要实例化6.实例属性...

2021-04-20 18:03:00 269

原创 异常处理

一、异常处理1.Try:2.手动抛异常raise Exception ('自定义异常')

2021-04-20 17:47:02 73

判断是否为质数

质数:在大于1的自然数中,除了1和它本身以外不再有其他因数。实现is_prime()函数,参数为整数,要有异常处理。如果整数时质数,返回True,否则返回False。def is_prime(num): if num < 1 or type(num) != int: return False elif num == 2: return True for i in range(2, num): if num % i == 0:

2021-04-20 16:37:38 566

原创 模块导入和路径处理

一、模块导入1.1 模块.py .pyc1.2 包__ init__.py二、模块导入2.1 分类自定义的、第三方库、python自带2.2 导入方式1. import 模块名 a.导入的是py文件 b.查看python默认找包的目录: import sys2. from 模块名 import 类、变量、函数3. from 模块名 import *4. from 项目名.包.py文件名称 import 类、变量、函数三、os模块 路径处理3.1 路径获

2021-04-19 18:11:13 118

原创 把txt的内容转成列表和字典

编写如下程序1、有两行数据,存放在txt文件里面(手动建立文件,并添加如下数据):url:/futureloan/mvc/api/member/register@mobile:18866668888@pwd:123456url:/futureloan/mvc/api/member/recharge@mobile:18866668888@amount:1000请利用上课所学知识,把txt里面的两行内容,取出然后返回如下格式的数据:(可定义函数)[{‘url’:’/futureloan/mvc/api

2021-04-19 17:11:49 1407

原创 文件操作 with open

open()file:你要打开的文件mode:读、写、读+写buffering=None:设置缓冲策略encoding=None:编码格式errors=None:指定编码错误处理的方式newline=None:换行的控制closefd=True:文件关闭的时候,文件描述是否关闭,默认是关闭一、文件读取f.read():读取文件的所有数据,默认从头开始,读取出来的数据类型为字符串f=open(file=r'C:\Users\upload_result.json',mode='r')r

2021-04-14 17:47:36 810 1

原创 给定一个整数 num,从 1 到 num 按照下面的规则返回每个数运算结果(for 循环;函数;append)

给定一个整数 num,从 1 到 num 按照下面的规则返回每个数运算结果如果num被 3 整除,返回 ‘Fizz’。如果num被 5 整除,返回 ‘Buzz’。如果num能同时被 3 和 5 整除,返回 ‘FizzBuzz’。如果num既不能被 3 也不能被 5 整除,返回这个数字的字符串格式def test01(num): re_list = [] for i in range(1, num+1): #range函数左闭右开 if i % 3 == 0 an

2021-04-14 15:25:37 1849 2

原创 函数的基本操作

一、函数1.定义:一段可以被另一段代码执行的代码2.语法def 函数名(参数): 函数体 return 需要返回的值3.调用函数名(参数)4.参数4.1 必传参数a、必要传对应个数的参数b、参数要以正确的顺序传入,参数的位置要与实际期望值一一对应4.2 关键字参数(顺序不需要对应)def test_function(name,age) print(name,age)test_function(age=20,name="Alice")4.3 不定长参数(可以不传参数)a.

2021-04-12 17:32:32 126

原创 输出99乘法口诀表

for i in range(1, 10): for j in range(1, i + 1): mul = i * j print("{}*{}={}\t".format(i, j, mul), end=" ") print(" ")熟练运用format功能,需要制表符/t对齐各列print方法默认换行,要是不换行修改end

2021-04-12 15:15:29 148

原创 用户输入月份,判断这个月是哪个季节

month = int(input("请输入月份:"))month_list=[[3,4,5,"春季"],[6,7,8,"夏季"],[9,10,11,"秋季"],[12,1,2,"冬季"]]if month in range(1,13): for i in range(len(month_list)): if month in month_list[i]: print(month, "月是", month_list[i][-1])else: pr

2021-04-12 14:47:58 2992

原创 选择结构和循环结构基础(debug断点)

一、复合的if else语句用户输入的数据默认都是str类型num =int(input('please input:'))if num>0: print('num>0')elif num==0: print('num>0') else: print('num<0') 二、debug技能1.step over(F8):重新执行下一步2.rerun(CTRL+F5):重新执行当前.py文件3.stop(CTRL+F2):终止执行三

2021-04-09 17:22:38 144

原创 集合

一、特点1.无序2.元素不可以重复3.不支持索引取值二、相关操作1.创建set1={1,2,3}2.添加元素set1.add3.删除pop、remove、clear4.去重列表list=[1,1,1,2,2,3,3,4,4,5]new_list = list(set(list1))数据类型转换1.int 、str 相互转换2.list 、tuple、set 相互转换...

2021-04-08 17:19:01 73

原创 字典的使用

一、特性1.通过键值对来表示元素2.key唯一且不可修改,若重复认为是同一个元素二、增1.dict_1={'key':'val1','key2':'val2'}2.dict_2=dict(a=2,b=1)3.list1=['a','b','c'] #key list2=[1,2,3] #val res=dict.fromkeys(list1,list2)三、删四、改五、查通过key来拿valdict_1={'key':'val1','key2':'val2'}1

2021-04-04 20:25:09 106

原创 列表和元组的基本运算

1.成员运算(返回布尔值)1.1. in1.2. not inlist=[1,2,3,4,5]print(1 in list)print(1 not in list)2.排序通过ASCII的值获取对应的字符print(chr(97))通过字符获取对应的ASCII码print(ord("a"))正序:在原有列表的基础上排序,没有返回值list=[4,2,33,51]list.sort()倒序:list=[4,2,33,51]list.sort(reverse=True)

2021-04-02 15:47:55 402 1

原创 列表重组有下面的列表 name_list = [‘house‘,‘car‘,‘money‘,‘dog‘] ,输出结果为:‘I have house, car, money and dog.‘

用format 会简单很多:name_list = ['house', 'car', 'money', 'dog']print("I have {},{},{} and {}".format(name_list[0], name_list[1], name_list[2],name_list[3]))

2021-04-02 11:24:42 325

原创 列表的特性和操作

列表的特点1.索引从0开始2.list是有序的3.可变4.元素可重复5.同一个list支持任意的数据类型一、增list=[1,2,3,4,5]print(list)二、删1.删除对应索引的元素:list.pop(index)del list[index]2.删除元素:list.remove(value)删除匹配的第一个元素3.清空列表 list.clear()三、改1.修改元素的值list=[1,2,3,4,5]list[0]="test"print(list)2

2021-03-31 17:49:23 711

原创 python实现“hello world hello python” 变成“python hello world hello”

正确代码:1.用split 再 join 切片后倒序的字符串str = "hello world hello python"str_1 = str.split()str_2 = " ".join(str_1[::-1])print(str_2)2.用split 再reverse ,最后join拼接str = "hello world hello python"str_1 = str.split()str_1.reverse()str_2 = " ".join(str_1)pr

2021-03-31 15:43:24 1171

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除