5)自动化测试模型
一、库
是代码集合;
面向对象的代码集合形成的库,为类库;
面向过程的为函数库;
WebDriver库,提供了一组操作Web页面的方法与类。(Web自动化测试库)
二、框架
为了解决一个或一类问题;unittest框架主要用于测试用例的组织和执行,以及测试结果的生成,帮助完成测试工作。
三、工具
封装,屏蔽底层代码,例如:QTP
四、模型
module.py
# -*- coding:utf-8 -*-
class Mail:
def __init__(self, driver):
self.driver = driver
def login(self, username, password):
"""登录"""
self.driver.find_element_by_name("email").clear()
self.driver.find_element_by_name("email").send_keys("username")
# 输入密码
self.driver.find_element_by_name("password").clear()
self.driver.find_element_by_name("password").send_keys("password")
# 点击登录
self.driver.find_element_by_id("dologin").click()
def logout(self):
"""登出"""
pass
# -*- coding:utf-8 -*-
from time import sleep
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from module import Mail
'''
自动化测试模型:模块化+参数化
模块化:把重复的操作单独封装成公共模块;
参数化:把测试数据参数化'''
# 登录邮箱为例
# 打开浏览器,输入网站地址
# driver = webdriver.chrome()
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get("https://email.163.com/")
sleep(2)
"""
# 输入账号driver.find_element_by_name("email").clear()
driver.find_element_by_name("email").send_keys("admin")
# 输入密码driver.find_element_by_name("password").clear()
driver.find_element_by_name("password").send_keys("admin123")
# 点击登录driver.find_element_by_id("dologin").click()
sleep(5)
# 退出登录#driver.find_element_by_name
#退出浏览器driver.quit()
"""
# 调用Mail类并接收driver驱动
mail = Mail(driver)
# 登录成功
mail.login("admin", "admin123")
'''如何实现下面的多个场景 ???'''
# mail.login("", "") # 登录账号为空
# mail.login("", "password") # 账号为空
# 登录之后的动作
sleep(5)
# 退出
mail.logout()
# 退出浏览器
driver.quit()
五、读取数据文件
测试数据放到数据文件中,常见数据文件的读取方法如下:
1)读取 txt 文件
常用方法:
read(): 读取整个文件
readline():读取一行数据
readlines(): 读取所有行的数据
实例:
# -*- coding:utf-8 -*-
'''需要优化为读取配置通用脚本'''
# 读取文件
with(open("./data_file/user_info.txt", "r")) as user_file:
data = user_file.readlines()
# 对文件内容进行格式化处理成数组类型
users = []
for line in data:
# [:-1]对字符串进行切片,去掉最后一个字符,因为每行结尾都有一个换行符”\n“
user = line[:-1].split(":")
users.append(user)
# 调试一下,打印出来
print(users)
2)读取CSV文件
# -*- coding:utf-8 -*-
import csv
import codecs
from itertools import islice
# 读取本地CSV文件
'''
1、通过codecs的open()方法,在打开文件时指定编码类型;2、通过CSV模块的reader()方法读取文件,避免中文乱码'''
data = csv.reader(codecs.open('./data_file/user_info.csv', 'r', 'utf_8_sig'))
# 仍存在问题:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd3 in position 0: invalid continuation byte
换成 gbk 编码类型 可解决
# 存放用户数据
users = []
# 循环输出每行信息
'''
1、itertools模块提供了用于操作迭代对象的函数islice()
2、islice()第一个参数指定迭代对象,第二个参数指定迭代的位置,第三个参数表示结束位。'''
for line in islice(data, 1, None):
users.append(line)
# 输出调试一下
print(users)
3)读取json文件
import json
with open("./data_file/user_info.json", 'r') as f:
data = f.read()
user_list = json.loads(data) #为何使用loads()方法???
print(user_list)
4)读取xml文件
from xml.dom.minidom import parse
# 打开xml文件
dom = parse('./data_file/config.xml')
# 获得文档元素对象
root = dom.documentElement
# 获取一组标签
tag_name = root.getElementsByTagName("platform")
# 第一种:获取标签对之间的数据
data = tag_name[0].firstChild.data
print(data)
# 第二种:获取标签的属性值
log_info = root.getElementsByTagName("login")
# 获取第一个login标签的username属性值
username = log_info[0].getAttribute('username')
print(username)
password = log_info[0].getAttribute('password')
print(password)
# 获取第二个login标签的username属性值
username = log_info[1].getAttribute('username')
print(username)