web自动化
生成HTML测试报告
import unittest
# 导入第三方模块
from HTMLTestRunner import HTMLTestRunner
if __name__ == '__main__':
allCase = unittest.defaultTestLoader.discover("./scripts", pattern="test*.py")
with open("./report/report.html", "wb") as f:
# 操作步骤 1.文件 2.控制台输出级别 3.文件的标题 4.注释
HTMLTestRunner(f, 2, "报告标题", "备注").run(allCase)
po模式
po模式里包含三个包base,page,script 以及一个main方法
案例:使用po模式封装,自动化测试QQ邮箱,登录失败case。
创建一个base包,base里创建一个base_action的文件,该文件主要封装的是webdriver里定位元素和操作元素的方法。
from selenium.webdriver.support.wait import WebDriverWait
class BaseAction(object):
# 调用浏览器驱动的方法
def __init__(self, driver):
self.driver = driver
# 添加显式等待,并定位元素的方法
def find_element(self, stamp, time=10, poll=0.1):
return WebDriverWait(self.driver, time, poll).until(lambda x: x.find_element(*stamp))
# 定位并点击元素的方法
def click(self, stamp, time=50, poll=0.1):
self.find_element(stamp, time, poll).click()
# 定位输入框,并输入数据的方法
def send_keys(self, stamp, text, time=10, poll=0.1):
self.find_element(stamp, time, poll).send_keys(text)
# 定位元素,并返回属性值的方法
def get_attribute(self, stamp, text, time=10, poll=0.1):
return self.find_element(stamp, time, poll).get_attribute(text)
# 定位元素,并返回文本内容的方法
def get_text(self, stamp, time=10, poll=0.1):
return self.find_element(stamp, time, poll).text
# 转换frame的方法
def switch_frame(self, text):
self.driver.switch_to.frame(text)
创建一个page包,page里创建一个文件login_QQ_page,该文件继承BaseAction,创建一个类,创建类属性,根据属性调用base里的方法。
from selenium.webdriver.common.by import By
from base.base_action import BaseAction
class LoginQQ(BaseAction):
# 元素特征
click_password_login = By.XPATH, '//*[@id="switcher_plogin"]' # 密码登录
user_name = By.ID, 'u' # 账号
pass_word = By.ID, 'p' # 密码
login_click = By.ID, 'login_button' # 登录按钮
check_label = By.XPATH, '//*[@id="newVcodeArea"]/div[1]/div/div[2]' # 断言 “安全注册”
frame1_label = By.CSS_SELECTOR, '#QQMailSdkTool_login_loginBox_qq>iframe' # frame1
frame2_label = By.ID, 'ptlogin_iframe' # frame2
# 切换到frame1
def frameLabel1(self):
self.switch_frame(self.find_element(self.frame1_label))
# 切换到frame2
def frameLabel2(self):
self.switch_frame(self.find_element(self.frame2_label))
# 点击密码登录
def clickPaLogin(self):
self.click(self.click_password_login)
# 输入账号
def userName(self, text):
self.send_keys(self.user_name, text)
# 输入密码
def passWord(self, text):
self.send_keys(self.pass_word, text)
# 点击登录按钮
def loginClick(self):
self.click(self.login_click)
# 断言
def checking(self):
return self.get_text(self.check_label)
创建一个scripts包,里面创建一个文件test_login_QQEmail,该文件中创建一个测试类,并实例化page的对象,去调用page里的方法。
import unittest
from selenium import webdriver
from time import sleep
from page.login_QQ_page import LoginQQ
class TestLoginQQ(unittest.TestCase):
# 初始化方法
def setUp(self):
self.driver = webdriver.Chrome()
self.driver.get('https://mail.qq.com/')
self.driver.maximize_window()
# 实例化page对象
self.login_QQ = LoginQQ(self.driver)
# 结束方法
def tearDown(self):
sleep(3)
self.driver.quit()
# QQ邮箱登录功能用例
def test_login_QQ(self):
self.login_QQ.frameLabel1()
self.login_QQ.frameLabel2()
self.login_QQ.clickPaLogin()
self.login_QQ.userName('666666')
self.login_QQ.passWord('123456')
self.login_QQ.loginClick()
assert self.login_QQ.checking() == '安全验证'
在项目里创建一个main文件,该文件去执行测试用例和生成HTML报告。
import unittest
from HTMLTestRunner import HTMLTestRunner
if __name__ == '__main__':
allCase = unittest.defaultTestLoader.discover('./scripts', 'test_login_QQEmail.py')
with open('./report/report.html', 'wb') as f:
HTMLTestRunner(f, 2, 'QQ邮箱登录功能测试报告', '请在windows系统和Chrome上运行此脚本').run(allCase)