深聊自动化测试之:小鱼整理21条避坑指南,让你完美运行自动化

2023-11-17

1、引言

在撸码过程中,99.1%的大佬,都不敢说自己的撸出来的代码,是不需要debug的。
换句话说,码农在撸码过程中,最痛苦的,莫过于撸出来的代码,又…
在这里插入图片描述

为了能避坑,小鱼也是在撸码过程中,总结的一点避坑方法,
请各位大佬笑纳

2、避坑内容总结

2.1无法定位到元素

遇到问题

找不到元素,脚本报“NoSuchElementException:Unable to find element”,或"定位到了,不能操作,点击无效

解决方法

  • 查看自己的“属性值”是否写正确

  • 元素的标签不唯一,默认找到第一个

  • 向上查看,元素是否在frame或iframe框架中

  • 查看元素是否在新打开的页面中,需要切换到新窗口

  • 换其它的定位方式:id/name/class name/tag name/link text/xpath/css selector

  • 检查元素属性是否是会变动的、是否是隐藏的

  • 添加等待时间sleep(),implicitly_wait(),WebDriverWait(driver, 10, 1).until(定位的元素, messages)

  • 查看标签的属性是否有“style=’display:none’->。元素不显示。属性改为block即可

  • 查看标签的属性是否有‘οnclick=return false’->。取消点击。属性改为false即可

  • 针对于9和8这两种情况,修改js属性:

js=”document.getElementById(‘title‘).style.display=’block’”
driver.execute_script(js)

2.2 Indentation Error

遇到问题
出现 Indentation Error

解决方法
脚本代码对其

2.3 PO设计模式类

1、使用PO设计模式封装页面元素类,需要有初始化函数"init"

2、页面元素调用Page类时候,Page函数,后面括号的“self”不用写

3、Page的初始化包含(self,driver)两个元素,在页面封装类中,初始化中调用方式为

Page.__init__(self,driver)

4、页面元素封装时候,定位方式一定要写对,否则报错

定位方式是实现WebUI自动化的基础

5、在页面封装中,类的初始化使用如下样式:

def __init__(self,driver):
	Page.__init__(self,driver)

6、类中定义变量,比如x=“hello”,调用时使用:self.x

7、在testcase中调用已封装的并且实例化的类时,在testcase中定义函数,不需要写self。

# -*- coding: utf-8 -*-
"""
@ auth : carl_DJ
@ time : 2020-12-19
"""

def test_pmlogin(self):
	try:
		driver = self.driver
		pm = Login(driver)
		pm.strat()
		pm.login_home()
		pm.login_username('admin')
		pm.login_password('8888888')
		pm.login_click()
		time.sleep(2)
		pm.quit()
	except Exception as e:
		logging.info(f"login in failed {e}")
		pm.quit()
		

2.4 页面封装类中没有已定义函数的问题:

2.4.1 提示没有该方法

遇到问题
在调用baseView.py文件的公共方法,提示:没有该方法

解决方法
1.需要在baseView.py文件确认,是否已封装该方法
2.导入的包/模块是否正确

2.4.2 没有定义好的函数

遇到问题
提示在页面封装类中没有baseView.py文件中定义好的函数

解决方法

①新建名字为module_baseView.pth文件,内容为“baseView.py文件”存放路径:例如(“E:\Progect”)

② 进入python的安装目录,将文件放到python3\lib\sit-packages文件夹下

③ 在测试用例中导入其他文件夹模块引入:import sys

④ sys.path.append(“…”)

⑤ from … import …

2.5 parater must be str

遇到问题
出现”parater must be str“

原因
使用参数有问题

解决方法

①在封装页面元素定位方式时,经常会会遇到二次定位

② 第一次定位调用基础类的方法,第二次定位就正常写就行了,
例如:

x=self.find_element(locu).find_element(By.ID,'locu')

2.6 继承

继承,使我们减少代码冗余及代码高效的常用方式。
子集继承父级(不是继承银子)

老规矩,上例子

"""
@ auth : carl_DJ
@ time : 2020-12-19
"""

def __init__(self,dirver):
	Logger.__init__(self,'DJ')
	self.log=self.getlog()
	self.driver = driver

2.7 not all arguments curerted during string format

遇到问题
打印输出时显示“not all arguments curerted during string format”

原因
前后参数不对应

解决方法
调整前后参数,使其一致

2.8 读取文件转码错误

遇到问题
读取txt文件的汉子和字符是,打印出一串编码,如下:
(b’\xef\xbb\xbf\xe5\xa5\xbd\xe7\x9a\x84\r\n’)

解决办法

"""
@ auth : carl_DJ
@ time : 2020-12-19
"""
x = open("test.txt","rb")
y = x.readlines()
for i in y:
	#追加utf8 格式
	j = i.decode('utf-8')
print(j)

x.close()

2.9 str object is not callable

遇到问题
出现"“str object is not callable”

原因
使用定义的变量名字与内置模块名字相同

解决办法
修改定义变量名

2.10 开启多窗口无法定位到最后一个句柄

遇到问题
开启多窗口,第一次得到的句柄列表为a=[1,2],第二次得到的句柄列表是b=[1,3,2],按照顺序排序,要切换到句柄3?

解决方法

首先把a和b变成集合,再取b不同于a的元素

c=list(set(b)-set(a))=[3] 

然后再转换为列表赋值给变量c

driver.switch_to.window(c[0]) 

2.11 Can not connect to the Service chromedriver

遇到问题
提示 Can not connect to the Service chromedriver

原因
chromedriver未被调用

解决方法
①python根目录存放chromedriver
②hrome版本号与chromedriver版本号 要匹配
③chromedriver追加到环境变量(Path)
④运行脚本调用chromedriver
⑤Firewalls 允许chromedriver运行

2.12 文件路径配置

读取数据文件,尽量使用参数化,即 调用os模块


import os

data_dir = os.path.dirname(os.path.abspath(__file__))
file_path = os.path.join(data_dir,'data1.txt')

2.13 文件改名与复制

python对文件进行"改名"和"复制"


#引入os模块
import os
data_dir = os.path.dirname(os.path.abspath(__file__))
old_file = os.path.join(data_dir,'data.txt')
new_file = os.path.join(data_dir,'new_data.txt')

#改名
os.rename(old_file,new_file)

#复制
os.system(f"copy {old_file},{new_file}"

2.14 调用脚本小技巧

技巧一
运行自动化脚本时,将鼠标放到屏幕中间或者下方,(有可能切换窗口时定位不到)

大量脚本运行,一般我们都是在后台运行

代码示例


options = webdriver.ChromeOptions()
options.add_argument('headless')
driver = webdriver.Chrome(options=options)

技巧二

cmd窗口,直接把结果写入文本

#测试报告
python allrun.py >>replor.html 

#log
nohup python my.py >> ../python/logfile/run.log 2>&1 

参数说明

nuhup

no hang up的缩写,即不挂断运行

2>&1

0: 表示stdin标准输入,用户键盘输入的内容
1 表示stdout标准输出,输出到显示屏的内容
2 表示stderr标准错误,报错内容

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深聊自动化测试之:小鱼整理21条避坑指南,让你完美运行自动化 的相关文章

随机推荐

  • html/css笔记 table表格文本垂直水平居中对齐方法

    简介 平时工作中开发经常会遇到html网页样式设计 这里记录一下笔记方便后期查看 也顺便给其他人提供一个参考 HTML 文本垂直水平居中对齐方法 一 css样式 水平居中 text align 应用于块级元素的文本水平居中 text ali
  • React 中ref的几种用法

    React 中ref的几种用法 1 字符串 通过 this refs a 来引用真实dom的节点 dom 节点上使用
  • 结构光相机国产、非国产统计参数对比分析

    结构光相机国产 非国产统计参数对比分析 1 Kinect v1 Kinect v1深度相机拥有一个RGB彩色摄像头 一个红外线CMOS摄像机和一个红外发射器 相机的红外线CMOS摄像机和红外发射器以左右水平的方式分布 该相机采用的是以结构光
  • Unix环境下Oracle数据库完全优化详解

    Unix环境下Oracle数据库完全优化详解 2007 04 19 12 54 02 作者 changelive 浏览次数 14 文字大小 大 中 小 进入论坛 如今的优化己经向优化等待 waits 转型了 实际中性能优化最根本的出现点也都
  • Windows驱动开发第11课(R3与R0通信交换数据第二节)

    在上一节课我们证实了在用户层调用CreateFile函数时 相应的在驱动层会响应一个IRP MJ CREATE的事件 这节课我们来看看用户层和驱动层是怎么交换数据的 首先来介绍一下控制码 由CTL CODE宏创建 是一个唯一的32位系统I
  • 数据库系统原理(第二版)知识点总结

    目录 第一章 概述 基本知识 数据模型 数据模型的组成要素 数据模型的分类 数据库系统的结构 第二章 关系运算 2 1 关系运算语言 1 关系代数语言 第三章 数据完整性 实体完整性 主属性的取值不能为空值 主属性的候选键的取值要非空且唯一
  • Python中的一些特殊函数

    https www cnblogs com maybe2030 p 4678920 html
  • centos7系统启动流程

    开机自检 gt 查找第一启动项设备 gt 加载第一启动项设备上的bootloader 存在于MBR中 gt 加载内核 initramfs gt 只读加载rootfs gt sbin init 即systemd
  • Flask 数据库 连接池、DBUtils、http 连接池

    1 DBUtils 简介 使用 DBUtils 简介 DBUtils 是一套用于管理 数据库 连接池 的Python包 为 高频度 高并发 的数据库访问提供更好的性能 可以自动管理连接对象的创建和释放 并允许对非线程安全的数据库接口进行线程
  • vector 查找_怎么写出无bug的二分查找算法代码

    封面图来自 geeksforgeeks 1 简介 二分查找算法是一类比较基础的算法 然而想要短时间内 写出二分查找的无 bug 版本 也不是很容易的 为此我查找了一些资料 终于弄清了二分查找算法的套路 在此分享给大家 也算是对自己学习知识的
  • Chisel3实践用例,安装

    新建SBT工程 sbt version 1 2 8 name ScalaExample version 0 1 scalaVersion 2 12 8
  • @Transient 理解

    transient使用小结 1 一旦变量被transient修饰 变量将不再是对象持久化的一部分 该变量内容在序列化后无法获得访问 2 transient关键字只能修饰变量 而不能修饰方法和类 注意 本地变量是不能被transient关键字
  • YOLOV2个人理解总结

    YOLOv2框架图 YOLOv2改进之处 1 Batch Normalization BN Batch Normalization 层简单讲就是对网络的每一层的输入都做了归一化 这样网络就不需要每层都去学数据的分布 收敛会快点 原来的YOL
  • 面试题:如何测试登录功能

    最近在做一个创新项目 这个项目有二个平台 每个平台都有前后端 故有四个系统 每个系统都有登录功能 而且不同系统代码设计方式都有所差异 所以就这个登录功能而言就要测试四次 看似一个简单的登录功能其中设计的测试点也是相当复杂 今天就讲讲如何测试
  • php scp跨服器拷贝文件到sftp

    一般要装php的ssh2扩展 比较麻烦 所以转念一想 为什么不用我们经常用的scp 但是scp跨服务器拷贝需要输入密码 这里就用到了一个工具试试sshpass 可以指定密码 1 工具安装 ubuntu安装 sudo apt get inst
  • 【问题解决】org.springframework.dao.QueryTimeoutException: Redis command timed out; nested exception is io

    1 出现问题异常 核心错误输出 org springframework dao QueryTimeoutException Redis command timed out nested exception is io lettuce cor
  • B站马士兵python入门基础版详细笔记(3)

    一 input函数的使用 他的返回值类型一定是str类型 m1 input please input the first word m2 input please input the second word print int m1 int
  • c++库 Android调用

    如果您想在Android应用程序中使用C 库 您可以通过以下几个步骤封装C 库以供Android调用 创建一个新的Android项目并设置C 支持 在Android Studio中创建一个新的Android项目 并选择包含C 支持的选项 将
  • [学C日记]---递归

    递归 自己调用自己 大事化小 必要条件 1 有限制条件 当满足限制条件时 递归便不继续 2 每次递归调用之后越来越接近这个限制条件 3 递归层次不能太深 太深容易栈溢出 每次递归调用都要给函数分栈区 次数过多容易空间不足 1 一串数字挨个输
  • 深聊自动化测试之:小鱼整理21条避坑指南,让你完美运行自动化

    自动化测试避坑总结 1 引言 2 避坑内容总结 2 1无法定位到元素 2 2 Indentation Error 2 3 PO设计模式类 2 4 页面封装类中没有已定义函数的问题 2 4 1 提示没有该方法 2 4 2 没有定义好的函数 2