什么是测试
通俗的来讲,程序测试就是运行程序,并发现程序的错误
专业的来讲,就是验证软件的正确性、完整性、安全性和质量的过程
测试的分类
1、按开发阶段划分:单元测试、集成测试、系统测试、验收测试
2、按是否查看代码划分:黑盒测试(功能,只关心软件中数据的输入输出)、白盒测试(逻辑测试,代码的测试)、灰盒测试(集成的测试)
3、按是否运行划分:静态测试、动态测试
4、按测试对象划分:性能测试、安全测试、兼容性测试、文档测试、业务测试、界面测试、安装测试、内存泄漏测试
5、按测试实施划分:α测试(在开发环境上测试,程序员自己测试)、β测试(验收测试,用户测试)、第三方测试
6、按是否手工执行划分:手工测试、自动化测试
7、其他分类:冒烟测试(针对不同版本的自测)、回归测试(修改代码后查看手否引入新问题)
采用架构
Python+Selenium
Selenium三剑客
selenium功能
1、测试与浏览器的兼容性
2、测试系统功能
三剑客
1、WebDriver
是客户端的API接口
测试人员通过调用这些接口,来访问数据库驱动,浏览器驱动再访问浏览器
远程测试
分布式测试
2、IDE
3、Grid
环境搭建
下载并安装Python
- 打开浏览器,输入https://www.python.org/,回车
- 选择Download
- 下拉,选择合适的版本,点击Download
- 下拉,选择合适的操作系统
- 点击下载
- 双击,点击安装
- 安装结束后,在命令提示符中输入pip install selenium,安装成功后,输入 pip list 查看是否真的成功
- 进入到安装目录下的Scripts路径下,将路径复制一下,放到环境变量–系统变量–path路径下
下载并安装PyCharm
- 打开浏览器,输入https://www.jetbrains.com/pycharm/download/#section=windows,回车
- 版本有企业版和社区版,个人使用社区版就ok了,点击Community下的Download
- 双击安装
- 安装完成后,将安装路径复制一下,放到环境变量–系统变量–path路径下
下载并安装驱动
- 打开浏览器,在帮助列表中,选择关于某个浏览器,查看当前浏览器所在版本
- 输入 https://www.selenium.dev/zh-cn/documentation/webdriver/getting_started/install_drivers/,回车
- 选择合适的浏览器,下载
- 下载完成后,解压缩,将chromedriver.exe或其他.exe文件复制到Python路径下
Selenium webDriver和浏览器之间是如何通信的
- 对于每一个脚本(客户端),一个HTTP请求就会被创建并发送给浏览器的驱动(服务器端)
- 浏览器驱动中含有一个HTTP Server,用来接收HTTP请求
- HTTP Server接收到请求后,具体操控对应的浏览器
- 浏览器执行具体的测试步骤
- 浏览器将测试的结果返回给浏览器驱动,浏览器驱动根据HTTP协议返回至Selenium脚本
注意:同一个驱动,为什么既可以接收Python请求,也可以接收Java请求?
因为WebDriver使用的协议是JSON Wrie protocol,通信的格式也是JSON
八大元素定位方法
id
find_element_by_id('id')
xpath
find_element_by_xpath('')
链接文本
find_element_by_link_text('文本信息')
部分链接文本
find_element_by_partial_link_text('部分文本信息')
标签名
find_element_by_tag_name('标签名')
name
find_element_by_name('name属性值')
css class
find_element_by_class_name('class属性值')
css选择器
find_element_by_css_selector('选择器')
**案例**
# _*_coding: UTF-8_*_
# 开发时间:2022/3/8 17:13
# 文件名称:demo01.py
# 开发人:HY
# 开发工具:PyCharm
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
class TestCase(object):
def __init__(self):
self.driver = webdriver.Chrome()
self.driver.get('https://www.baidu.com')
self.driver.maximize_window()
def test_location(self):
#针对id
el_id =self.driver.find_element(by=By.ID,value='su')
print(type(el_id))
print('---')
#针对超链接
el_lt=self.driver.find_element(by=By.LINK_TEXT,value='新闻')
print(el_lt.text)
print('---')
#针对超链接的模糊查询,可能会有多个结果出现
el_plt=self.driver.find_element(by=By.PARTIAL_LINK_TEXT,value='地')
print(el_plt.text)
print('---')
#针对name值,可能有多个相同的name,可以使用elements,返回一个列表
el_name=self.driver.find_element(by=By.NAME,value='f')
print(type(el_name))
print('---')
#针对标签名
el_tagname=self.driver.find_elements(by=By.TAG_NAME,value='input')
for el_tn in el_tagname:
print(el_tn.text)
print('---')
#针对class属性
el_cn=self.driver.find_element(by=By.CLASS_NAME,value='wrapper_new')
print(type(el_cn))
print('---')
#针对属性选择器:选中属性,右键复制selector
self.driver.find_element(by=By.CSS_SELECTOR,value='#kw').send_keys('baba')
sleep(3)
#针对xpath,基于树状结构使用
#分为绝对路径和相对路径
#绝对路径:从/html开始向下去找,下标从1开始
#相对路径://查找元素标签名[@属性名='属性值'] ://input[@id='kw']
# //查找元素标签名[text()='文本'] ://input[text()='新闻']
#//表示从根路径开始查,*表示查询所有元素://*
#模糊查找://查找元素标签名[contains(text,'部分文本')] 或 查找元素标签名[contains(属性名,'部分属性值')]
# //input[contains(text,'新')] 或 //input[contains(id,'k')]
print(self.driver.find_element(by=By.XPATH,value='//*[@id="s-top-left"]/a[4]'))
print('---')
self.driver.quit()
if __name__ == '__main__':
case = TestCase()
case.test_location()
**运行结果为:**
<class 'selenium.webdriver.remote.webelement.WebElement'>
---
新闻
---
地图
---
<class 'selenium.webdriver.remote.webelement.WebElement'>
---
---
<class 'selenium.webdriver.remote.webelement.WebElement'>
---
<selenium.webdriver.remote.webelement.WebElement (session="1abff176c21f13d8ff9097c40dfa5e04", element="af3f9e67-7856-40a0-989c-b293de95e5a8")>
---
Process finished with exit code 0
WebDriver属性
浏览器名称
driver.name
当前url
driver.current_url
当前页面标题
driver.title
当前页面源码
driver.page.source
窗口句柄
driver.current_window_handle
当前窗口所有句柄
driver.window_handles
案例:
# _*_coding: UTF-8_*_
# 开发时间:2022/3/8 10:53
# 文件名称:demo.py
# 开发人:HY
# 开发工具:PyCharm
from selenium import webdriver
from time import sleep
# 实例化驱动
class TestCase(object):
# 初始化方法
def __init__(self):
self.driver = webdriver.Chrome()
self.driver.get('http://www.baidu.com')
self.driver.maximize_window() #窗口最大化
# 对自动化的简单测试案例
def test(self):
self.driver.find_element_by_id("kw").send_keys("Python")
self.driver.find_element_by_id("su").click()
sleep(5)
self.driver.quit()
# 对属性的测试
def test_prop(self):
print(self.driver.name) #浏览器名称:chrome
print(self.driver.current_url) #当前url:https://www.baidu.com/
print(self.driver.current_window_handle) #窗口句柄:CDwindow-D16A526E45965F046DA0132901423210
print(self.driver.window_handles) #当前窗口所有句柄:['CDwindow-D16A526E45965F046DA0132901423210']
print(self.driver.title) #当前页面标题:百度一下,你就知道
print(self.driver.page_source) #当前页面的源码:略
self.driver.quit()
if __name__ == '__main__':
case = TestCase()
# case.test()
case.test_prop()
WebDriver的方法:
back:返回上一个页面
self.driver.back() #返回上一个页面
refresh:刷新
self.driver.refresh() #刷新当前页面
forward;向前走
self.driver.forward() #前进
close与quit有什么区别
close只关闭当前tab;
quit会关闭浏览器,所有的tab都会关闭
WebElement有哪些属性:
测试站网址:http://sahitest.com/demo/ 提供了一些测试内容
- 标识:id
- 宽高:size
- 宽高和坐标:rect
- 标签名称:tag_name
- 文本内容:text
**案例:**
# _*_coding: UTF-8_*_
# 开发时间:2022/3/8 15:18
# 文件名称:demo02.py
# 开发人:HY
# 开发工具:PyCharm
from selenium import webdriver
from time import sleep
class TestCase(object):
def __init__(self):
self.driver = webdriver.Chrome()
self.driver.get('http://sahitest.com/demo/linkTest.htm')
def test_WebElement_prop(self):
e = self.driver.find_element_by_id('t1')
print(type(e)) #e的类型:<class 'selenium.webdriver.remote.webelement.WebElement'>
print(e.id) #id:唯一 4dfa776d-184e-4be6-a853-bb687e146984
print(e.rect) #宽高和坐标 矩形框:{'height': 22, 'width': 703, 'x': 8, 'y': 539.9125366210938}
print(e.size) #宽高:{'height': 22, 'width': 703}
print(e.tag_name) #标签名:input
print(e.text) #文本:空
if __name__ == '__main__':
case = TestCase()
case.test_WebElement_prop()
WebElement有哪些方法:
- 输入内容:send_keys()
- 清空内容:clear()
- 单击:click()
- 获得属性值:get_attribute()
- 是否被选中:is_selected()
- 是否可用:is_enabled()
- 是否显示:is_displayed()
- css属性值:value_of_css_property()
**案例**
# _*_coding: UTF-8_*_
# 开发时间:2022/3/8 15:38
# 文件名称:demo03.py
# 开发人:HY
# 开发工具:PyCharm
from selenium import webdriver
from time import sleep
class TestCase(object):
def __init__(self):
self.driver = webdriver.Chrome()
self.driver.get('http://sahitest.com/demo/linkTest.htm')
def test_webelement_method(self):
e = self.driver.find_element_by_id('t1') #拿到元素
e.send_keys('好运来') #输入内容
sleep(2)
print(e.get_attribute('type')) #获得属性值
print(e.value_of_css_property('font')) # css属性值
sleep(3)
e.clear() # 清空内容
if __name__ == '__main__':
case = TestCase()
case.test_webelement_method()
页面之间的切换
**案例**
# _*_coding: UTF-8_*_
# 开发时间:2022/3/8 15:54
# 文件名称:demo04.py
# 开发人:HY
# 开发工具:PyCharm
from selenium import webdriver
from time import sleep
class TestCase(object):
def __init__(self):
self.driver = webdriver.Chrome()
self.driver.get('https://www.baidu.com/')
def test_windows(self):
self.driver.find_element_by_link_text('新闻').click() #定位到新闻页面并点击跳转
windows = self.driver.window_handles
while 1: # 永真,一直切换
for window in windows:
self.driver.switch_to.window(window)
sleep(2)
if __name__ == '__main__':
case = TestCase()
case.test_windows()
form表单的处理
流程
- 定位表单元素
- 输入测试值
- 判断表单元素属性
- 获得表单元素属性
- 提交表单进行验证
**案例**
# _*_coding: UTF-8_*_
# 开发时间:2022/3/8 16:16
# 文件名称:demo05.py
# 开发人:HY
# 开发工具:PyCharm
import os.path
from selenium import webdriver
from time import sleep
class TestCase(object):
def __init__(self):
self.driver = webdriver.Chrome()
path = os.path.dirname(os.path.abspath(__file__) ) #获取项目所在路径
file_path ='file:///' +path+'/from01.html' #获取文件所在路径
self.driver.get(file_path)
def test_login(self):
username = self.driver.find_element_by_id('username')
username.send_keys('zhangsan')
password = self.driver.find_element_by_id('pwd')
password.send_keys('123456')
#获取用户名及密码的值
print(username.get_attribute('value'))
print(password.get_attribute('value'))
sleep(3)
self.driver.find_element_by_id('submit').click()
if __name__ == '__main__':
case =TestCase()
case.test_login()
alert还未执行结束,如果下面还有代码运行,会抛出异常,此时我们可以在alert执行代码下面加上这句话:
self.driver.switch_to.alert.accept()