#自动化测试库、框架和工具的区别
# 1.自动化测试库(library)
# 库是代码集成的一个产品,供程序员调用,如webdriver就是一个库(web自动化测试库)。面向对象的代码组织形成的库叫类库;面向过程的代码组织形成的库叫函数库
# 2.自动化测试框架(framework)
# 框架是为解决一个或一类问题而开发的产品。用户一般只要使用框架提供的函数或类,就可实现全部功能,如unitest框架(他主要用于实现测试用例的组织和执行,以及测试结果的生成)
# 3.自动化测试工具(tools)
# 与框架所做的事情类似,屏蔽了底层代码,一般会提供单独的操作界面供用户操作,如selenium IDE和QTP
#自动化测试模型:自动化测试框架与工具设计的思想
# 1.线性测试
# a.通过录制或编写对应用程序的操作步骤产生相应的线性脚本,每个测试脚本相对独立,且不产生其他依赖与调用
# b.开发成本搞,测试用例直接可以会存在重复的操作,需为每一个用例去只做或编写重复的操作
# c.维护成本高,正是因为用例之间存在重复操作,所以当这些用例发生变化后,就要逐一去修改
# 2.模块化驱动测试
# a.借鉴编程语言中模块化的思想,把重复的操作做成公共模块,当用例执行过程中需要用到这一模块操作时被调用,这样消除了重复从而提高了用例的可维护性
# b.提高了开发效率,不用重复编写相同的操作脚本
# c.简化了维护的复杂性,对于重复的操作只要修改公共模块即可,无需逐一去修改
#模块化驱动实例(将登录和退出写成函数,需要的时候直接调用就好了)
# from selenium import webdriver
# driver = webdriver.Firefox()
# driver.get("https://login.xiu.com/")
#
# def login():
# driver.find_element_by_link_text("密码登录").click()
# driver.find_element_by_id("J_username").clear()
# driver.find_element_by_id("J_username").send_keys("13684995613")
# driver.find_element_by_id("J_password").clear()
# driver.find_element_by_id("J_password").send_keys("jmy@123")
# driver.find_element_by_id("login_Btn").click()
#
# def logout():
# driver.find_element_by_link_text("[ 退出 ]").click()
# driver.quit()
# login()
# logout()
# 3.数据驱动测试
# a.数据驱动说白点就是数据的参数化,因为输入数据的不同从而引起输出结果的不同(数据与脚本分离)
# b.进一步增强了脚本的复用性,操作步骤一致、测试数据不一致的时候,只需要输入不同的测试数据就可以执行
#数据驱动实例(将用户名和密码参数化,调用这个函数的时候随意传入一个正确的账号和密码即可)
# from selenium import webdriver
# driver = webdriver.Firefox()
# driver.get("https://login.xiu.com/")
#
# def login(username,passwd):
# driver.find_element_by_link_text("密码登录").click()
# driver.find_element_by_id("J_username").clear()
# driver.find_element_by_id("J_username").send_keys(username)
# driver.find_element_by_id("J_password").clear()
# driver.find_element_by_id("J_password").send_keys(passwd)
# driver.find_element_by_id("login_Btn").click()
#
# def logout():
# driver.find_element_by_link_text("[ 退出 ]").click()
# driver.quit()
# login("13694917391","xiu123456")
# logout()
# 4.关键字驱动测试
# a.关键字驱动与数据驱动相比,无非是把“数据”换成“关键字”,通过关键字的改变引起测试结果的改变
# b.典型的关键字驱动工具:QTP、robot framework(RIDE)、selenium IDE等。这类工具封装了底层的代码,提供给用户独立的图像界面,以填表格的形式免除测试人员对代码的恐惧,从而降低脚本编写的难度
#参数化搜索关键字
# from selenium import webdriver
# search_text = ['python','selenium','自动化测试']
#
# for text in search_text:
# driver = webdriver.Firefox()
# driver.get("http://www.baidu.com")
# driver.find_element_by_id("kw").send_keys(text)
# driver.find_element_by_id("su").click()
# driver.quit()
#读取文件:read()读取整个文件;readline()读取一行数据;readlines()读取所有行的数据
# 以上面的登录为例子
# 存放用户信息的文件(user.txt)
# 13684995613,jmy@123
# 13694917391,xiu123456
# 111111,aaaa
# user_file = open('user.txt','r')
# lines = user_file.readlines()
# user_file.close()
#
# for line in lines:
# username = line.split(',')[0]
# password = line.split(',')[1]
# print("用户名:%s,密码:%s"%(username,password))
# 读取CSV文件
# CSV文件内容:
# test,123@qq.com,19,man
# test1,234@qq.com,20,woman
# test2,345@qq.com,21,man
# import csv
# date = csv.reader(open('info.csv','r'))
#
# for user in date:
# print(user[1])
# print(user)
# C:\Users\xiu\AppData\Local\Programs\Python\Python36-32\python.exe D:/study/besttest/XIU/ffff.py
# 123@qq.com
# ['test', '123@qq.com', '19', 'man']
# 234@qq.com
# ['test1', '234@qq.com', '20', 'woman']
# 345@qq.com
# ['test2', '345@qq.com', '21', 'man']
#
# Process finished with exit code 0
#读取XML文件:有时候我们需要测试的数据是不规则的,例如我们要一个配置文件保存当前自动化测试脚本的URL、浏览器、用户名和密码等
# info.xml文件
# <?xml version="1.0" encoding="utf-8" ?>
# <info>
# <base>
# <platform>windows</platform>
# <browser>Firefox</browser>
# <url>http://www.baidu.com</url>
# <login username="admin" password="123456"/>
# <login username="guest" password="654321"/>
# </base>
# <test>
# <province>北京</province>
# <province>广东</province>
# <city>深圳</city>
# <city>珠海</city>
# <city>佛山</city>
# <city>广州</city>
# <province>浙江</province>
# <city>杭州</city>
# </test>
# </info>
# 1.获得标签信息
# from xml.dom import minidom
# dom = minidom.parse('info.xml') #打开文档
# root = dom.documentElement #获得文档元素对象
# print(root.nodeName)
# print(root.nodeValue)
# print(root.nodeType)
# print(root.ELEMENT_NODE)
# C:\Users\xiu\AppData\Local\Programs\Python\Python36-32\python.exe D:/study/besttest/XIU/ffff.py
# info
# None
# 1
# 1
#
# Process finished with exit code 0
# 2.获得任意标签名
# from xml.dom import minidom
#
# dom = minidom.parse('info.xml')
# root = dom.documentElement
#
# tagname = root.getElementsByTagName('browser')
# print(tagname[0].tagName)
# tagname=root.getElementsByTagName('login')
# print(tagname[1].tagName)
# tagname=root.getElementsByTagName('province')
# print(tagname[2].tagName)
# C:\Users\xiu\AppData\Local\Programs\Python\Python36-32\python.exe D:/study/besttest/XIU/ffff.py
# browser
# login
# province
#
# Process finished with exit code 0
# 3.获得标签的属性值
# from xml.dom import minidom
#
# dom = minidom.parse('info.xml')
# root = dom.documentElement
# logins = root.getElementsByTagName('login')
#
# #获得login标签的username属性值
# username = logins[0].getAttribute("username")
# print(username)
# #获得login标签的password属性值
# passwd = logins[0].getAttribute("password")
# print(passwd)
#
# username=logins[1].getAttribute("username")
# print(username)
# passwd = logins[1].getAttribute("password")
# print(passwd)
# C:\Users\xiu\AppData\Local\Programs\Python\Python36-32\python.exe D:/study/besttest/XIU/ffff.py
# admin
# 123456
# guest
# 654321
#
# Process finished with exit code 0
# 4.获得标签对之间的数据
# from xml.dom import minidom
#
# dom = minidom.parse('info.xml')
# root = dom.documentElement
# province = root.getElementsByTagName('province')
# citys = dom.getElementsByTagName('city')
#获得第二个province标签对的值
# p2 = province[1].firstChild.data
# print(p2)
#
# c1 = citys[0].firstChild.data
# print(c1)
# c2 = citys[1].firstChild.data
# print(c2)
# C:\Users\xiu\AppData\Local\Programs\Python\Python36-32\python.exe D:/study/besttest/XIU/ffff.py
# 广东
# 深圳
# 珠海
#
# Process finished with exit code 0