学习笔记之自动化测试模型_02

本文详细介绍了自动化测试中的模块化和数据驱动技术。通过126邮箱登录的模块化实例,展示了如何将登录和退出操作封装成独立的模块或类。接着,利用数据驱动方法演示了126邮箱的多个用户登录,以及百度搜索的测试。此外,还讲解了读取txt、CSV和XML文件的不同方法,为自动化测试提供数据支持。
摘要由CSDN通过智能技术生成

模块化实例

以126邮箱来演示代码如下:

from selenium import webdriver
driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.get("http://www.126.com")
#登陆
driver.find_element_by_link_text("密码登录").click()
#找到用户名和密码登录所在的frame层,这里参数为空,是因为这个frame的那么为空
driver.switch_to_frame("")
#清空文本框内容
driver.find_element_by_xpath("//*[@name='email' and @data-loginname='loginEmail']").clear()
#输入用户名
driver.find_element_by_xpath("//*[@name='email' and @data-loginname='loginEmail']").send_keys("username")
#清空文本框内容
driver.find_element_by_name("password").clear()
#输入密码
driver.find_element_by_name("password").send_keys("password")
#单击登录按钮
driver.find_element_by_id("dologin").click()
#退出当前表单层
driver.switch_to.default_content()
#退出登录
driver.find_element_by_link_text("退出").click()
#关闭网页
driver.quit()

这里126的登录好一顿找,居然表单套表单了,这里表单操作,我在“学习笔记之webdriver_API_02”中讲过,不过跳出当前表单层貌似用不了,我就在网上找了一个方法“driver.switch_to.default_content()”就跳出当前层了,我学习得视频是2013年的,可能方法比较落后,每个脚本都是我跑过一边没问题的,我才会写到这里,所以实例和概念可能有一些冲突。但是我会保证每个脚本都能跑通
将以上登录和退出代码模块化:
新建一个mail126_01的Python文件,将登录和退出模块化保存下来


#登录
#这里的driver相当于一个接口
def login(driver):
    driver.find_element_by_link_text("密码登录").click()
    driver.switch_to_frame("")
    driver.find_element_by_xpath("//*[@name='email' and @data-loginname='loginEmail']").clear()
    driver.find_element_by_xpath("//*[@name='email' and @data-loginname='loginEmail']").send_keys("username")
    driver.find_element_by_name("password").clear()
    driver.find_element_by_name("password").send_keys("password")
    driver.find_element_by_id("dologin").click()
#退出
def logout(driver):
    driver.switch_to.default_content()
    driver.find_element_by_link_text("退出").click()
    driver.quit()

新建一个mail126_diaoyong_01的Python文件:

from selenium import webdriver
#调用模块里面的登录和退出方法
from mail126_01 import login,logout
import time
driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.get("http://www.126.com")
#测试用例
#调用登录
login(driver)
#调用退出
logout(driver)

也可以将登录和退出封装成一个类,login和logout相当于类中的两个方法,写法如下:

class Login():
    def __init__(self,driver):
        self.driver=driver
    #登录
    #这里的driver相当于一个接口
    def login(self):
        driver=self.driver
        driver.find_element_by_link_text("密码登录").click()
        driver.switch_to_frame("")
        driver.find_element_by_xpath("//*[@name='email' and @data-loginname='loginEmail']").clear()
        driver.find_element_by_xpath("//*[@name='email' and @data-loginname='loginEmail']").send_keys("username")
        driver.find_element_by_name("password").clear()
        driver.find_element_by_name("password").send_keys("password")
        driver.find_element_by_id("dologin").click()
    #退出
    def logout(self):
        driver=self.driver
        driver.switch_to.default_content()
        driver.find_element_by_link_text("退出").click()
        driver.quit()

重新调用一下:

from selenium import webdriver
#调用模块里面的登录和退出方法
from mail126_02 import Login
import time
driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.get("http://www.126.com")
#测试用例
#调用登录
Login(driver).login()
#调用退出
Login(driver).logout()

数据驱动实例

126邮箱登录

创建公共类:

#将登录邮箱的用户名和密码参数化
#不同用户的测试用例
#将登录和退出封装成一个类,这才是正确写法
class Login():
    def __init__(self,driver):
        self.driver=driver
    #登录
    #这里的driver相当于一个接口
    def login(self,username,password):
        driver=self.driver
        driver.find_element_by_link_text("密码登录").click()
        driver.switch_to_frame("")
        driver.find_element_by_xpath("//*[@name='email' and @data-loginname='loginEmail']").clear()
        driver.find_element_by_xpath("//*[@name='email' and @data-loginname='loginEmail']").send_keys(username)
        driver.find_element_by_name("password").clear()
        driver.find_element_by_name("password").send_keys(password)
        driver.find_element_by_id("dologin").click()
    #退出
    def logout(self):
        driver=self.driver
        driver.switch_to.default_content()
        driver.find_element_by_link_text("退出").click()
        driver.quit()

调用,并且模拟用户登录:

#调用类中的登录和退出方法
#模拟不同用户测试用例
from selenium import webdriver
#调用模块里面的登录和退出方法
from mail126_03 import Login
import time
driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.get("http://www.126.com")
#测试用例
#调用登录
Login(driver).login("username","password")
#调用退出
Login(driver).logout()

这种方法就可以在代码中实现多个用户登录,比较优雅的书写方式:

from selenium import webdriver
driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.get("http://www.126.com")
class Account(object):
    def __init__(self,username='',password=''):
        self.username=username
        self.password=password
    def do_login_as(user_info):
        driver.find_element_by_id("idInput").clear()
        driver.find_element_by_id("idInput").send_keys("user_info.username")
        driver.find_element_by_id("pwdInput").clear()
        driver.find_element_by_id("pwdInput").send_keys("user_info.password")
        driver.find_element_by_id("loginBtn").click()
    #实例登录信息
admin = Account(username='name',password='123')
gust = Account(username='name1',password='123')
#调用登录函数
do_login_as(admin)
do_login_as(gust)

百度搜索

具体的测试开发不会这么写,会把搜索模块化,然后使用断言来确定页面中搜索的参数是正确的,这里只是为了表示百度搜索的可以被数据驱动:

from selenium import webdriver
import time
'''
file_info = open('info.txt','r')
values = file_info.readline()
file_info.close()
'''
#将文件换为一个数组
shuzu=['Python','webdriver','自动化测试']
for serch in shuzu:
    driver = webdriver.Firefox()
    driver.implicitly_wait(10)
    driver.get("http://www.baidu.com")
    driver.find_element_by_id('kw').send_keys(serch)
    driver.find_element_by_id('su').click()
    time.sleep(2)
    driver.quit()

读取txt文件

有以下几种读取文件方式:

  1. read() 读取整个文件
  2. readline() 读取一行数据
  3. readlines() 读取所有行的数据
    新建一个user_info.txt,每一行存放用户名和密码,它们之间用逗号隔开:

zhangsan,123
lisi,456
wangwu,789

读取txt文件的Python代码:

from selenium import webdriver
user_file = open('user_info.txt','r')#在Python2 中可以用open也可以用file,Python3只能用open
values = user_file.readlines()#读取所有行
#读取完后,一定要关闭
user_file.close()
#ctrl+d批量修改代码中相同名字的变量
for i in values:
    username = i.split(';')[0] #split分割
    print(username)
    password = i.split(';')[1]
    print(password)

使用字典的方式:

from selenium import webdriver
zidian = {'zhangsan':'123','lisi':'456','wangwu':'789'}
for k,v in zidian.items():
    print(k,v)

读取CSV文件

如果一组数据中包括用户名、密码、邮箱、年龄、性别等信息,name用split()方法拆分就不那么方便了,因为它一次只能将字符串拆分成左右两个部分。
新建一个CSV文件,首先见一个Excel表格,输入内容后,另存为CSV文件格式
读取CSV文件的Python代码:

#读取CSV文件
import csv
my_file = 'user_info.csv'
date = csv.reader(open(my_file,'r'))
for user in date:
    print(user)

也可以读取每一行的某一个元素:

#读取CSV文件
import csv
my_file = 'user_info.csv'
date = csv.reader(open(my_file,'r'))
#循环每一行的信息,可以读取所有文件,也可以读取部分数据
for user in date:
    print(user[3])#读取每一行角标为3的元素

读取xml文件

需要一个配置文件来配置当前自动化测试脚本的URL、浏览器、登录用户名/密码等,这个时候可以选择XML文件来配置这些信息。
XML即可扩展标记语言,也可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。
XML有如下特征:
首先由标签:
标签可有属性:
标签对可以嵌入数据:abc
标签可以有层级关系:

	<aa>
		<bb>
		</bb>
	</aa>

新建一个xml文件:

<?xml version="1.0" encoding="utf-8" ?>
<catalog>
    <maxid>4</maxid>
    <login username = "pytest" passwd="123456">
        <caption>python</caption>
        <item id="4">
            <caption>test</caption>
        </item>
    </login>
    <item id="2">
            <caption>Zope</caption>
    </item>
</catalog>

读取文件的Python代码:

#读取xml文件
from xml.dom.minidom import parse
#打开xml文档
dom = parse('user_info.xml')
#得到文档元素对象
root = dom.documentElement
print(root.nodeName)
print(root.nodeValue)
print(root.nodeType)
print(root.ELEMENT_NODE)

打印结果:
在这里插入图片描述
获取文档中的标签名:

#读取xml文件
from xml.dom.minidom import parse
#打开xml文档
dom = parse('user_info.xml')
#得到文档元素的标签名
root = dom.documentElement
tagname1 = root.getElementsByTagName('maxid')
print(tagname1[0].tagName)
tagname2 = root.getElementsByTagName('caption')[2]#没有其他角标的时候,指定2,3...都会报错
print(tagname2.tagName)
tagname3 = root.getElementsByTagName('item')
print(tagname3[1].tagName)

打印结果:
在这里插入图片描述
获取文档中标签的属性:

获取标签属性比较有用

#获取属性
from xml.dom.minidom import parse
#打开xml文档
dom = parse('user_info.xml')
#得到文档元素的标签名
root = dom.documentElement
tagname1 = root.getElementsByTagName('login')[0]#没有其他角标的时候,指定2,3...都会报错
print(tagname1.getAttribute("username"))
tagname2 = root.getElementsByTagName('login')[0]
print(tagname2.getAttribute("passwd"))

打印结果:
在这里插入图片描述
获取标签对中的text信息:

#获取属性
from xml.dom.minidom import parse
#打开xml文档
dom = parse('user_info.xml')
#得到文档元素的标签名
root = dom.documentElement
tagname1 = root.getElementsByTagName('maxid')[0]#要找的标签
print(tagname1.firstChild.data) #第一个孩子的数据
tagname2 = root.getElementsByTagName('caption')[0]
print(tagname2.firstChild.data)

打印结果:
在这里插入图片描述
有三个caption可以根据角标,打印出相应的text信息,Python3读取xml中的中文也是没有问题,Python2容易出现乱码。

其中page project这种模型,会在后面学习中写出来,这里就不写了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值