目录
1、引言
2、避坑内容总结
2.1无法定位到元素
2.2 Indentation Error
2.3 PO设计模式类
2.4 页面封装类中没有已定义函数的问题
2.4.1 提示没有该方法
2.4.2 没有定义好的函数
2.5 parater must be str
2.6 继承
2.7 not all arguments curerted during string format
2.8 读取文件转码错误
2.10 开启多窗口无法定位到最后一个句柄
2.11 Can not connect to the Service chromedriver
2.12 文件路径配置
2.13 文件改名与复制
2.14 调用脚本小技巧
1、引言
自动化测试的重要性越来越受到人们的重视,因为它可以提高测试效率、降低测试成本并减少人为错误的出现。为了满足这个需求,越来越多的公司开始采用自动化测试来保证软件质量。
为了能避坑,博主也是在撸码过程中,总结的一点避坑方法,
请各位大佬笑纳
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、页面元素封装时候,定位方式一定要写对,否则报错
5、在页面封装中,类的初始化使用如下样式:
def __init__(self,driver):
Page.__init__(self,driver)
6、类中定义变量,比如x=“hello”,调用时使用:self.x
7、在testcase中调用已封装的并且实例化的类时,在testcase中定义函数,不需要写self。
# -*- coding: utf-8 -*-
"""
@ auth : Carl_奕然
@ time : 2022-02-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_奕然
@ time : 2022-02-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_奕然
@ time : 2022-02-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标准错误,报错内容
作为一位过来人也是希望大家少走一些弯路,在这里我给大家分享一些自动化测试前进之路的必须品,希望能对你带来帮助。(WEB自动化测试、app自动化测试、接口自动化测试、持续集成、自动化测试开发、大厂面试真题、简历模板等等),相信能使你更好的进步!
留【自动化测试】即可:【自动化测试交流】:574737577(备注ccc)http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=1MDs4T0SvhL4arRoq3njIVb9HGXrRoj6&authKey=sx1h5dj77OV5obrcx6nE7Dn3sqEVuE4XrGqzqneReBJy3ojOL3oHMSH48XPKPWhW&noverify=0&group_code=574737577