Selenium3+python自动化013-自动化数据驱动及模型介绍

一、查看当前运行的浏览等相关信息

1 driver=webdriver.Chrome()
2 print(driver.capabilities["version"]) #浏览器版本
3 print(driver.capabilities["platform"]) #浏览器运行平台
4 print(driver.capabilities["browserName"]) #浏览器名称
1 75.0.3770.100
2 Windows NT
3 chrome

 

二、自动化测试框架搭建篇:数据驱动测试

1.数据驱动概述

相同的测试脚本使用不同的测试数据来执行,测试数据和测试行为完全分离,这样的测试脚本设计模式称为数据驱动。

实施数据驱动测试步骤如下:
(1)编写测试脚本,脚本需要支持从程序对象、文件或数据库读入测试数据
(2)将测试脚本使用的测试数据存入程序对象、文件或数据库等外部介质中
(3)运行脚本过程中,循环调用存储在外部介质中的测试数据
(4)验证所有的测试结果是否符合预期结果

 1 # @Author:lsj
 2 # @version V1.0
 3 # -*- coding:UTF-8 -*-
 4 
 5 import unittest
 6 from selenium import webdriver
 7 from time import sleep
 8 from selenium.webdriver.support.ui import WebDriverWait
 9 from selenium.webdriver.support import expected_conditions as EC
10 from selenium.webdriver.common.by import By
11 
12 # 打开浏览器
13 def openBroswer():
14     driver = webdriver.Chrome()
15     return driver
16 # 获取URL地址
17 def openUrl(driver, url):
18     driver.get(url)
19     driver.maximize_window()
20 
21 # 元素是否存在
22 def ele_is_presence(driver, tuple_arg):
23     return WebDriverWait(driver, 10).until(EC.presence_of_element_located(tuple_arg))
24 
25 # 点击操作
26 def ele_click(driver, tuple_arg):
27     ele_is_presence(driver, tuple_arg).click()
28 
29 # 发送文本
30 def ele_sendKeys(driver, tuple_arg, keyword):
31     ele_is_presence(driver, tuple_arg).send_keys(keyword)
32 
33 # 检查登录结果
34 def checkResult(driver, loginfo):
35     try:
36         ele_is_presence(driver, loginfo)
37         print("登录状态验证通过!")
38     except:
39         print("登录失败!")
40 # 退出
41 def quitbrowser(driver):
42         sleep(2)
43         driver.quit()
44 
45 class Test_Login():
46     url = 'http://daxue.qysxy.com.cn/admin/static/front/html/login.html'
47     account = ['fuguang',"admin","fuguangl"]
48     pwd = ['123456','123456','123456']
49     c = ['1111', '2222','1111']
50     username = (By.NAME, "username")  # 用户名输入框
51     password = (By.NAME, "password")  # 密码输入框
52     code = (By.ID, "code")  # 验证码输入框
53     loginbtn = (By.ID, 'loginBtn')  # 登录按钮
54 
55 
56     # 实例化driver
57     driver = openBroswer()
58     # 打开url
59     openUrl(driver, url)
60     # 首页点击登录按钮
61     ele_click(driver, loginbtn)
62 
63     length = len(account)
64     # 输入用户名
65     for i in range(0, length):
66         #for j in range(0, length):
67             ele_sendKeys(driver, username, account[i])
68             # 输入密码
69             ele_sendKeys(driver, password, pwd[i])
70             # 输入验证码
71             ele_sendKeys(driver,code,c[i])
72             # 点击登录按钮
73             ele_click(driver, loginbtn)
74             sleep(3)
75             driver.refresh()
76     quitbrowser(driver)
77 
78 if __name__ == '__main__':
79     Test_Login()
简单的数据驱动设计模式

对上面的数据整理到一个文件中,如下所示,导入到Excel中

 

2.数据驱动单元测试的环境准备

2.1、openpyxl模块的安装:pip install openpyxl,验证方式如下:from openpyxl import load_workbook

没有报错证明安装成功。

2.2、注意openpyxl只能操作xlsx文件而不能操作xls文件

2.3、在openpyxl中,主要用到三个概念:Workbooks,Sheets,Cells 

(1)Workbook就是一个excel工作表,如下操作

#打开一个xlsx文件
wb=load_workbook('test.xlsx')

 

(2)Sheet是工作表中的一张表页,如下有三种方式

#获取一张表(一)
# sheet1=wb.get_sheet_by_name('Sheet1')
#获取一张表(二)
# sheet1=wb['Sheet1']
#获取一张表(三)
sheet1=wb.worksheets[0]

 

(3)Cell就是简单的一个格

# @Author:lsj
# @version V1.0
# -*- coding:UTF-8 -*-

from openpyxl import load_workbook

#打开一个xlsx文件
wb=load_workbook('test_budaoguan.xlsx')

#获取一张表(一)
# sheet1=wb.get_sheet_by_name('Sheet1')
#获取一张表(二)
# sheet1=wb['Sheet1']
#获取一张表(三)
sheet1=wb.worksheets[0]
# 打印sheet1
print(sheet1)

#表格中输入内容,注意:当文件打开时,数据写不进去。
sheet1['A1']='TEST'
#保存(修改之后需要保存,否则修改无效)
wb.save('test_budaoguan.xlsx')

运行结果如下

 

#打印表名
print("表名:",sheet1.title)
#读取一整行(传入行号)
print("读取一整行:",sheet1[1])
#读取某一列
print("读取某一列:",sheet1['A'])
#读取某一格的值
print("读取某一格:",sheet1['A1'])
print("读取某一格的值:",sheet1['A1'].value)

#获取最大行数
print("获取最大行数:",sheet1.max_row)
#获取最大列数
print("获取最大列数:",sheet1.max_column)

  运行结果:

表名: Sheet2
读取一整行: (<Cell 'Sheet2'.A1>,)
读取某一列: (<Cell 'Sheet2'.A1>,)
读取某一格: <Cell 'Sheet2'.A1>
读取某一格的值: TEST
获取最大行数: 1
获取最大列数: 1

  

# 获取所有行
# print(sheet1.rows)
# 获取所有的列
# print(sheet1.columns)

  

3.使用Excel进行数据驱动测试

测试逻辑:
1.打开百度首页,从Excel文件中读取数据作为搜索关键词
2.在搜索输入框中输入读取出的搜索关键词
3.单击搜索按钮
4.断言搜索结果页面中是否出现Excel文件中提供的预期内容,包含则认为测试执行成功,否则认为失败

 如下图所示:

 

# 获取所有行
print(sheet1.rows)
# 获取所有的列
print(sheet1.columns)

# 遍历行
for row in sheet1.rows:
    # 遍历行中是格
    for cell in row:
        print(cell.value,end='	')
    print()
print(20*'=')
# 遍历列
for column in sheet1.columns:
      #遍历列中的格
    for cell in column:
        print(cell.value, end='	')
    print()

  运行结果

<generator object Worksheet._cells_by_row at 0x000000000BA6BFC0>
<generator object Worksheet._cells_by_col at 0x000000000BA6BFC0>
序号	搜索词	期望结果	
1	郎平	排球	
2	李宁	体操	
3	王楠	乒乓球
====================

  序号 1 2 3
  搜索词 郎平 李宁 王楠
  期望结果 排球 体操 乒乓球 

以上的方法封装到一个类中

 1 # @Author:lsj
 2 # @version V1.0
 3 # -*- coding:UTF-8 -*-
 4 
 5 from openpyxl import load_workbook
 6 
 7 # 建立一个ExcelMethod类
 8 class ExcelMethod():
 9     def readExcel(self,filename):
10         self.filename = filename
11         # 创建一个大列表
12         excel_list = []
13 
14         # # 创建一个小列表
15         # son_list = []
16 
17         # 获取workbook对象
18         self.wb = load_workbook(self.filename)
19         # 获取第二个sheet表
20         self.sheet = self.wb.worksheets[3]
21         # 获取行
22         for row in self.sheet.rows:
23             # 为了避免son_list.append无限追加值,每次换行清空一次值
24             son_list = []
25             # 获得每一行的一列
26             for cell in row:
27                 # 取出值
28                 # print(cell.value)
29                 # 把第一行里的内容按列表加入到son_list[]中
30                 son_list.append(cell.value)
31 
32             # 把小列表加入到大列表里中
33             excel_list.append(son_list)
34         # 打印出列表
35         print(excel_list)
36         # 列表切片操作从取出1以后的列表
37         return excel_list[1:]
38 
39 if __name__== "__main__":
40     # ExcelMethod().readExcel("test_budaoguan.xlsx")
41     print(ExcelMethod().readExcel("test_budaoguan.xlsx"))
建立一个ExcelMethod类,读取excel文件
# @Author:lsj
# @version V1.0
# -*- coding:UTF-8 -*-

import unittest
from selenium import webdriver
from qianyan.test_budaoguan.excel_method import ExcelMethod
from time import sleep

class Excel_Test(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        # 调用浏览器
        cls.driver = webdriver.Chrome()
        # 输入url地址
        cls.driver.get("http://daxue.qysxy.com.cn/admin/static/front/html/login.html")
        # 页面最大化
        cls.driver.maximize_window()
        # 读取文件
        cls.excelmethod = ExcelMethod()
        cls.user_list = cls.excelmethod.readExcel("test_budaoguan.xlsx")

    # 测试方法
    def test_search(self):
        for i in range(0,len(self.user_list)):
            # 获取元素位置,用户名输入框
            username = self.driver.find_element_by_id("username")
            # 获取元素位置,密码输入框
            password = self.driver.find_element_by_id("password")
            # 获取元素位置,验证码输入框
            code = self.driver.find_element_by_id("code")
            # 清空用户名输入框
            username.clear()
            password.clear()  # 清空用户名输入框
            code.clear()  # 清空验证码输入框
            # 填写用户名输入框,填写第一个列表中的第二个数据,为了让数据按顺序自动往下执行,加入for循环状态
            username.send_keys(self.user_list[i][1])
            password.send_keys(self.user_list[i][2])
            code.send_keys(self.user_list[i][3])
            sleep(1)
            self.driver.find_element_by_id("loginBtn").click()
            # # 出现弹框
            # btn = self.driver.switch_to_alert()
            # sleep(3)
            # # 获取按钮上的文本
            # print(btn.text)
            sleep(3)
            self.assertTrue(self.user_list[i][4] in self.driver.page_source)
            # 打印页面源码
            print(self.driver.page_source)

    @classmethod
    def tearDownClass(cls):
        cls.driver.quit()

if __name__ == "__main__":
    unittest.main()
建一个测试方法调取ExcelMethod类

 

原文地址:https://www.cnblogs.com/liunaixu/p/11129809.html