什么??没有好的学习资料,给你准备好了!!
安装python:双击自定义安装 或者 在cmd中输入python-3.7.0-amd64.exe的路径,即在电脑中存放的位置,回车即可弹出安装页面,勾选Add Python 3.7 to PATH,即自动配置环境变量。
在我学习Ui自动化时,总会遇到浏览器驱动版本问题,小伙伴也是一头雾水也找不到下载的地方,今天给大家整理
chromedriver版本 | 支持的chrome版本 |
---|---|
v2.46 | v72-74 |
v2.45 | v70-72 |
v2.44 | v69-71 |
v2.43 | v69-71 |
v2.42 | v68-70 |
v2.41 | v67-69 |
v2.40 | v66-68 |
v2.39 | v66-68 |
v2.38 | v65-67 |
v2.37 | v64-66 |
v2.36 | v63-65 |
v2.35 | v62-64 |
v2.34 | v61-63 |
v2.33 | v60-62 |
v2.32 | v59-61 |
v2.31 | v58-60 |
v2.30 | v58-60 |
==============================================================================
点击下载chrome的webdriver:https://npm.taobao.org/mirrors/chromedriver
点击下载chrome的历史版本:https://www.chromedownloads.net/
点击进入谷歌官方版本对应页面:https://sites.google.com/a/chromium.org/chromedriver/downloads
点击进入微软edge浏览器wendriver版本对应下载页面:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/#downloads
点击进入ie浏览器driver下载:http://selenium-release.storage.googleapis.com/index.html
点击进入ie浏览器官方github:https://github.com/SeleniumHQ/selenium/wiki/InternetExplorerDriver
点击进入safari浏览器官方地址:https://developer.apple.com/safari/download/
开始自动化测试之前,需了解浏览器的一些基本操作,以方便后续的自动测试。码上开始吧!
from selenium import webdriver
#! /usr/bin/python3
# @Author : 一凡
from selenium import webdriver
url = "http://localhost:8080/Shopping/index.jsp"
# 也可以用其它浏览器:比如Firefox()等等
brower = webdriver.Chrome()
# 打开浏览器
brower.get(url)
#! /usr/bin/python3
# @Author : 一凡
from selenium import webdriver
import time
url = "http://localhost:8080/Shopping/index.jsp"
webdriver.Firefox
brower = webdriver.Chrome()
brower.get(url)
# 强制等待3秒
time.sleep(3)
#! /usr/bin/python3
# @Author : 一凡
from selenium import webdriver
url = "http://localhost:8080/Shopping/index.jsp"
webdriver.Firefox
brower = webdriver.Chrome()
brower.get(url)
# 刷新页面
brower.refresh()
#! /usr/bin/python3
# @Author : 一凡
from selenium import webdriver
import time
url = "http://localhost:8080/Shopping/index.jsp"
webdriver.Firefox
brower = webdriver.Chrome()
brower.get(url)
# 实际效果自己操作,当前就不做演式了
# 后退
brower.back()
# 前
brower.forward()
#! /usr/bin/python3
# @Author : 一凡
from selenium import webdriver
import time
url = "http://localhost:8080/Shopping/index.jsp"
webdriver.Firefox
brower = webdriver.Chrome()
brower.get(url)
# 设置窗口大小
brower.set_window_size(1280, 720)
# 设置全屏
# brower.maximize_window()
#! /usr/bin/python3
# @Author : 一凡
from selenium import webdriver
import time
url = "http://localhost:8080/Shopping/index.jsp"
webdriver.Firefox
brower = webdriver.Chrome()
brower.get(url)
brower.get_screenshot_as_file("./test.png")
# 退出浏览器进程
brower.quit()
#! /usr/bin/python3
# @Author : 一凡
from selenium import webdriver
import time
url = "http://localhost:8080/Shopping/index.jsp"
webdriver.Firefox
brower = webdriver.Chrome()
brower.get(url)
time.sleep(3)
# 退出浏览器进程
brower.quit()
# -*- coding:utf-8 -*-
# @Author : 一凡
from selenium import webdriver
import time
url = "https://www.baidu.com/"
driver = webdriver.Chrome()
driver.get(url)
driver.find_element_by_id("kw").send_keys("好好学习|天天向上")
driver.find_element_by_id("su").click()
time.sleep(3)
driver.quit()
# -*- coding:utf-8 -*-
# @Author : 一凡
from selenium import webdriver
import time
url = "https://www.baidu.com/"
driver = webdriver.Chrome()
driver.get(url)
driver.find_element_by_name("wd").send_keys("好好学习|天天向上")
driver.find_element_by_id("su").click()
time.sleep(3)
driver.quit()
# -*- coding:utf-8 -*-
# @Author : 一凡
from selenium import webdriver
import time
url = "https://www.baidu.com/"
driver = webdriver.Chrome()
driver.get(url)
driver.find_element_by_class_name("s_ipt").send_keys("好好学习|天天向上")
driver.find_element_by_id("su").click()
time.sleep(3)
driver.quit()
# -*- coding:utf-8 -*-
# @Author : 一凡
from selenium import webdriver
import time
# 这里使用优设导航的百度搜索界面
# 获取浏览器对象
driver = webdriver.Chrome()
# 获取网络链接
url = "https://hao.uisdc.com/"
driver.get(url)
time.sleep(3)
# 获取搜索输入框,输入:优设导航的百度搜索
driver.find_element_by_tag_name("input").send_keys("优设导航的百度搜索")
# 暂停3秒
time.sleep(3)
# 退出浏览器驱动
driver.quit()
# -*- coding:utf-8 -*-
# @Author : 一凡
from selenium import webdriver
import time
url = "https://www.baidu.com/"
driver = webdriver.Chrome()
driver.get(url)
driver.find_element_by_link_text("新闻").click()
time.sleep(3)
driver.quit()
# -*- coding:utf-8 -*-
# @Author : 一凡
from selenium import webdriver
import time
url = "http://news.baidu.com/"
driver = webdriver.Chrome()
driver.get(url)
driver.find_element_by_partial_link_text("守护蓝色地球").click()
time.sleep(3)
# driver.quit()
# -*- coding:utf-8 -*-
# @Author : 一凡
from selenium import webdriver
url = "https://www.baidu.com/"
driver = webdriver.Chrome()
driver.get(url)
path = "//*[@id='s-top-left']/a"
elements = driver.find_elements_by_xpath(path)
# 返回列表
print(len(elements))
# 通过列表方法获取相应的元素进行点击
elements[0].click()
# -*- coding: utf-8 -*-
# @Author : 一凡
from selenium import webdriver
brower = webdriver.Chrome()
brower.get( "https://www.baidu.com" )
# xpath通过id定位
brower.find_element_by_xpath("//*[@id= 'kw']").click()
# xpath通过name定位
brower.find_element_by_xpath("//*[@name='wd']").click()
# xpath通过class_name定位
brower.find_element_by_xpath("//*[@class='s_ipt' ]").click()
# -*- coding: utf-8 -*-
# @Author : 一凡
from selenium import webdriver
brower = webdriver.Chrome()
brower.get( "https://www.baidu.com" )
#用xpath通过其它属性定位
brower.find_element_by_xpath("//*[@autocomplete='off']").send_keys("Python")
# -*- coding: utf-8 -*-
# @Author : 一凡
from selenium import webdriver
brower = webdriver.Chrome()
brower.get( "https://www.baidu.com" )
#用xpath通过其它属性定位
brower.find_element_by_xpath("//input[@id='kw']").send_keys( "Pthon")
# -*- coding: utf-8 -*-
# @Author : 一凡
from selenium import webdriver
brower = webdriver.Chrome()
brower.get( "https://www.sogou.com" )
#通过老爸的span的class属性定位输入框
brower.find_element_by_xpath("//span[@class='sec-input-box']/input").send_keys("Python")
#通过爷爷的form的id属性来定位输入框
brower.find_element_by_xpath("//form[@id='sf']/span/input").send_keys("Python")
# -*- coding: utf-8 -*-
# @Author : 一凡
from selenium import webdriver
brower = webdriver.Chrome()
brower.get( "https://www.baidu.com" )
##定位设置
brower.find_element_by_link_text("设置").click()##定位搜索设置
# brower.find_element_by_xpath("html/body/div[1]/div[6]/a[1]").click()
#定义每页显示10条
brower.find_element_by_xpath("//select[@id='nr']/option[1]")
#定义每页显示20条
brower.find_element_by_xpath("//select[@id='nr']/option[2]")
# 定义每页显示50条
brower.find_element_by_xpath("//select[@id='nr']/option[3]")
# -*- coding: utf-8 -*-
# @Author : 一凡
from selenium import webdriver
brower = webdriver.Chrome()
brower.get( "https://www.baidu.com" )
# xpath逻辑运算
brower.find_element_by_xpath("//*[id='kw' and name='wd']")
1.id定位:find_element_by_id(self, id_)
2.name定位:find_element_by_name(self, name)
3.class定位:find_element_by_class_name(self, name)
4.tag定位:find_element_by_tag_name(self, name)
5.link定位:find_element_by_link_text(self, link_text)
6.partial_link定位find_element_by_partial_link_text(self, link_text)
下面两种要重点掌握其中一种,两者都会是更好的。现在我比较喜欢用xpath定位
7.xpath定位:find_element_by_xpath(self, xpath)
8.css定位:find_element_by_css_selector(self, css_selector)
1.id复数定位find_elements_by_id(self, id_)
2.name复数定位find_elements_by_name(self, name)
3.class复数定位find_elements_by_class_name(self, name)
4.tag复数定位find_elements_by_tag_name(self, name)
5.link复数定位find_elements_by_link_text(self, text)
6.partial_link复数定位find_elements_by_partial_link_text(self, link_text)
7.xpath复数定位find_elements_by_xpath(self, xpath)
8.css复数定位find_elements_by_css_selector(self, css_selector)
# -*- coding: utf-8 -*-
# @Author : 一凡
from selenium import webdriver
brower = webdriver.Chrome()
brower.get("https://www.baidu.com/")#elements注意这个后面带有s,即复数的意思
elements = brower.find_elements_by_xpath("//*[@class='mnav']")#返回形式为列表形式
print(type(elements))
print(elements)
操作元素
# -*- coding: utf-8 -*-
# @Author : 一凡
from selenium import webdriver
brower = webdriver.Chrome()
brower.get("https://www.baidu.com/")#elements注意这个后面带有s,即复数的意思
elements = brower.find_elements_by_xpath("//*[@class='mnav']")#返回形式为列表形式
print(type(elements))
print(elements)
# 获取元素text信息(此步骤可省略)列表下标从o开始
print(elements[3].text)
#列表索引方法获取视频元素,并进行点击操作
elements[3].click()
brower.quit()
# -*- coding: utf-8 -*-
# @Author : 一凡
#打开文件
path = "test.txt"
file = open(path, 'r')#读取所有行的数据
r = file.readlines()
# split通过指定分隔符对字符串进行切片,此处分割符是逗号(,)
# #以列表形式返回,所以后面下标为别为:o和1
for i in r:
user = i.split(",")[0]
password = i.split(',')[1]
#然后行简单的登陆,传入参数并打印登录相关信息
def login(user, password):
if user == "laozhu":
print("管理员%s登录成功"%user)
print('----------')
else:
print("会员%s登录成功" % user)
login(user, password)
#!/usr/bin/python3
import xlrd
class excel_data:
"""读取excl表接口数据"""
# 替换自己的文件目录地址
data_path = "E:\\api_interface\\data\\interface.xlsx"
# 打开文件
excel = xlrd.open_workbook(data_path)
# 通过下标定位表格
sheet = excel.sheet_by_index(0)
# 行: 6 和列数: 5
rows, cols = sheet.nrows, sheet.ncols
def read_excl(self):
# 获取第一行数据key
first_row = self.sheet.row_values(0)
# print(first_row) # [编号,接口方式,host, params, result]
# 定义空列表,用于存放用例数据
self.result = []
# 从第一行用例开始循环(1, 6)循环5次
for i in range(1, self.rows):
# 定义空字典
info_dict = {
}
# 每1次大循环要循环5次(字典里有5组数据)
for j in range(0, self.cols):
# j=0,1,2,3,4
# 添加到字典 (1)[0]---第2行第1例的值,依次循环
info_dict[first_row[j]] = self.sheet.row_values(i)[j]
# 将数据存放在列表中
self.result.append(info_dict)
print(self.result)
if __name__ == "__main__":
ex = excel_data()
ex.read_excl()
#!/usr/bin/python3
import yaml
import os
# 获取当前脚本所在文件夹路径
curPath = os.path.dirname(os.path.realpath(__file__))
# 获取yaml文件路径
yamlPath = os.path.join(curPath, "E:\\api_interface\\config\\yaml.yaml")
# open方法打开直接读出来
open_file = open(yamlPath, 'r', encoding='utf-8')
result = open_file.read()
file_dict = yaml.load(result, Loader=yaml.FullLoader) # 用load方法转字典
print(file_dict)
# 在使用键盘按键方法前需要先导入 keys 类包:
from selenium.webdriver.common.keys import Keys
# -*- coding:utf-8 -*-
# @Author : 一凡
# 鼠标操作
from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
import time
# 导入键盘模块
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/") # 打开百度
driver.maximize_window()
driver.find_element_by_id("kw").send_keys("Python")
time.sleep(3)
# 全选
driver.find_element_by_id("kw").send_keys(Keys.CONTROL, "a")
time.sleep(3)
# 剪切
driver.find_element_by_id("kw").send_keys(Keys.CONTROL, "x")
driver.get("http://www.sogou.com")
time.sleep(3)
# 黏贴
driver.find_element_by_id("query").send_keys(Keys.CONTROL, "v")
# 在使用鼠标操作前需要先导入ActionChains类包:
from selenium.webdriver.common.action_chains import ActionChains
# -*- coding:utf-8 -*-
# @Author : 一凡
# 鼠标操作
from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
import time
# 导入键盘模块
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/") # 打开百度
driver.maximize_window()
# 定位新闻
element = driver.find_element_by_link_text("新闻")
time.sleep(5)
# 左击操作
ActionChains(driver).click(element).perform()
# ac = ActionChains(driver)
# ac.click(element).perform()
操作思路:
# -*- coding:utf-8 -*-
# @Author : 一凡
from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
element = driver.find_element_by_id("kw")
time.sleep(3)
# 操作元素
ActionChains(driver).context_click(element).perform()
操作思路:
# -*- coding:utf-8 -*-
# @Author : 一凡
from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
element = driver.find_element_by_id("kw")
element.send_keys("好好学习")
time.sleep(3)
# 双击操作
ActionChains(driver).double_click(element).perform()
操作思路:
# -*- coding:utf-8 -*-
# @Author : 一凡
from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("http://127.0.0.1:5000/signin")
driver.find_element_by_link_text("练习鼠标拖拽").click()
element1 = driver.find_element_by_id("dragger")
# 复数定位返回结果是什么类型:列表
element2 = driver.find_elements_by_class_name("item")[3]
time.sleep(3)
# 拖动操作
ActionChains(driver).drag_and_drop(element1, element2).perform()
操作思路:
# -*- coding:utf-8 -*-
# @Author : 一凡
from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.maximize_window()
mouse = driver.find_element_by_id("s-usersetting-top")
# 悬停操作
ActionChains(driver).move_to_element(mouse).perform()
time.sleep(5)
driver.find_element_by_xpath('//*[@id="s-user-setting-menu"]/div/a[2]').click()
操作思路:
# -*- coding:utf-8 -*-
# @Author : 一凡
from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
element = driver.find_element_by_link_text("贴吧")
# 按下左键操作
ActionChains(driver).click_and_hold(element).perform()
time.sleep(5)
ActionChains(driver).release(element).perform()
# -*- coding: utf-8 -*-
# @Author : 一凡
from selenium import webdriver
import time
brower = webdriver.Chrome()
brower.get("https://www.qq.com/")
time.sleep(3)
# 打印标题
print(brower.title)
# -*- coding: utf-8 -*-
# @Author : 一凡
from selenium import webdriver
import time
brower = webdriver.Chrome()
brower.get("https://www.qq.com/")
time.sleep(3)
# 打印URL
print(brower.current_url)
# -*- coding: utf-8 -*-
# @Author : 一凡
from selenium import webdriver
import time
brower = webdriver.Chrome()
brower.get("https://www.baidu.com/")
time.sleep(3)
# 获取标签
tag = brower.find_element_by_id("su").tag_name
print(tag)
# -*- coding: utf-8 -*-
# @Author : 一凡
from selenium import webdriver
import time
brower = webdriver.Chrome()
brower.get("https://www.baidu.com/")
time.sleep(3)
brower.find_element_by_id("kw").send_keys("python")
value = brower.find_element_by_id("kw").get_attribute("value")
print(value)
# 打印属性
python
# -*- coding: utf-8 -*-
# @Author : 一凡
from selenium import webdriver
import time
brower = webdriver.Chrome()
brower.get("https://www.baidu.com/")
time.sleep(3)
value = brower.find_element_by_id("kw").get_attribute("value")
print(value)
# 打印属性
百度一下
如下图这种显示在页面上的文本信息,可以直接获取到
2.查看元素属性:
<a id="setf" target="_blank" onmousedown="return ns_c({
'fm':'behs','tab':'favorites','pos':0})
" href="//www.baidu.com/cache/sethelp/help.html">把百度设为主页a>
# -*- coding: utf-8 -*-
# @Author : 一凡
from selenium import webdriver
import time
brower = webdriver.Chrome()
brower.get("https://www.baidu.com/")
time.sleep(3)
text = brower.find_element_by_id("setf").text
print(text)
# 运行结果
把百度设为主页
from selenium import webdriver
import time
brower = webdriver.Chrome()
brower.get("https://www.baidu.com/")
time.sleep(3)
# 获取浏览器名称
print brower.name
# -*- coding: utf-8 -*-
# @Author : 一凡
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
brower = webdriver.Chrome()
brower.get("https://www.qq.com")
title = EC.title_is(u"腾讯首页")
print(title(brower))
# -*- coding: utf-8 -*-
# @Author : 一凡
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
brower = webdriver.Chrome()
brower.get("https://www.qq.com")
print(EC.title_contains("腾讯")(brower))
# -*- coding: utf-8 -*-
# @Author : 一凡
from selenium import webdriver
brower = webdriver.Chrome()
brower.get("https://www.baidu.com")
def is_element_exist(x_p):
s = brower.find_elements_by_xpath(xpath=x_p)
if len(s) == 0:
print("元素未找到:%s"%x_p)
return False
elif len(s) == 1:
return True
else:
print("找到%s个元素:%s"%( len(s),x_p))
return False
#判断页面有无id为kw的元素
if is_element_exist("//*[@id='kw']"):
brower.find_element_by_id("kw") .send_keys( "Python")
print(is_element_exist("//*[@id='kw']"))
#判断页面有无class_name为mnav的元素
if is_element_exist("//*[@class='mnav']"):
brower.find_elements_by_class_name("mnav")
#判断页面有无id为xx的元素
if is_element_exist("XX"):
brower.find_element_by_id("xx").send_keys( "Python")
如果要判断按钮上的文本,就不能用上面那个方法
导入模块:from selenium.webdriver.support import expected_conditions as EC
# -*- coding: utf-8 -*-
# @Author : 一凡
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
brower = webdriver.Chrome()
brower.get("https://www.baidu.com")
#locator参数是定位的方法
locator = ("id", "su")
# #text参数是期望的值
ext = u"百度一下"
#判读正确返回True,否之则返回False
result = EC.text_to_be_present_in_element_value(locator,text)(brower)
print(result)
有些页面的链接打开后,会重新打开一个窗口,对于这种情况,想在新页面上操作,就得先切换窗口了。获取窗口的唯一标识用句柄表示,所以只需要切换句柄,我们就能在多个页面上灵活自如的操作了。
# -*- coding: utf-8 -*-
# @Author : 一凡
from selenium import webdriver
import time
brower = webdriver.Chrome()
brower.get("https://www.qq.com/")
time.sleep(3)
#获取当前窗口句柄
handle = brower.current_window_handle
print(handle)
# 运行结果
CDwindow-3706F8F466314BE560AC3766144F6D00
# -*- coding: utf-8 -*-
# @Author : 一凡
from selenium import webdriver
import time
brower = webdriver.Chrome()
brower.get("https://www.qq.com/")
time.sleep( 3)
handle = brower.current_window_handle#
# 打印首页句柄
print(handle)
brower.find_element_by_partial_link_text("娱乐").click()
all_handles = brower.window_handles
#打印所有句柄
print(all_handles)
# 运行结果
CDwindow-DE1541A4FD1DCE8660391A4BC7D16FC6
['CDwindow-DE1541A4FD1DCE8660391A4BC7D16FC6', 'CDwindow-217802088FCAB1ABD977BA061AF0822F']
# -*- coding: utf-8 -*-
# @Author : 一凡
from selenium import webdriver
import time
brower = webdriver.Chrome()
brower.get("https://www.qq.com/")
time.sleep(3)
brower.find_element_by_partial_link_text("娱乐").click()
#获取所有的句柄
all_handles = brower.window_handles
#切换句柄
brower.switch_to.window(all_handles[1])
#切换之后打印页面标题
print("切换后句柄标题是:", brower.title)
# 运行结果
切换后句柄标题是: 娱乐-腾讯网
# -*- coding: utf-8 -*-
# @Author : 码上开始
import time
from selenium import webdriver
driver = webdriver.Chrome()
# 打开百度首页
driver.get(r'https://www.baidu.com/')
# 强制等待3秒
time.sleep(3)
driver.find_element_by_css_selector("#kw").send_keys("selenium")
# 退出
driver.quit()
# -*- coding: utf-8 -*-
# @Author : 码上开始
import time
from selenium import webdriver
driver = webdriver.Chrome()
# 打开百度首页
driver.get(r'https://www.baidu.com/')
# 隐性等待5秒
driver.implicitly_wait(5)
driver.find_element_by_css_selector("#kw").send_keys("selenium")
# 退出
driver.quit()
# 导入模块
from selenium.webdriver.support.wait import WebDriverWait
expected_conditions是selenium的一个模块
包含一系列可用于判断的条件
可以对网页上元素是否存在,可点击等等进行判断,一般用于断言或与WebDriverWait配合使用
from selenium.webdriver.support import expected_conditions as EC
# -*- coding: utf-8 -*-
# @Author : 码上开始
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
# 等待10s,等待过程中如果定位到元素,就直接执行后续的代码,反之等待10s后报错误信息
# 验证元素是否出现,传入的参数都是元组类型的locator,如(By.ID, ‘kw’)
WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, "kw"))).send_keys("好好学习")
#判断当前页面的title是否精确等于预期,返回布尔值
WebDriverWait(driver,10).until(EC.title_is("百度一下,你就知道"))
#判断当前页面的title是否包含预期字符串,返回布尔值
WebDriverWait(driver,10).until(EC.title_contains('new'))
#判断当前页面的url是否精确等于预期,返回布尔值
WebDriverWait(driver,10).until(EC.url_contains('https://www.baidu.com'))
#判断当前页面的url是否包含预期字符串,返回布尔值
WebDriverWait(driver,10).until(EC.url_contains('baidu'))
#判断当前页面的url是否满足字符串正则表达式匹配,返回布尔值
WebDriverWait(driver,10).until(EC.url_matches('.+baidu.+'))
#判断元素是否出现,只要有一个元素出现,返回元素对象
WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,'kw')))
#判断元素是否可见,返回元素对象
WebDriverWait(driver,10).until(EC.visibility_of(driver.find_element(By.ID,'kw')))
#判断元素是否包含指定文本,返回布尔值
WebDriverWait(driver,10).until(EC.text_to_be_present_in_element((By.NAME,'tj_trnews'),'新闻'))
#判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去
WebDriverWait(driver,10,).until(EC.frame_to_be_available_and_switch_to_it(By.xpath,'//iframe'))
#判断某个元素是否可见并且是可点击的,如果是的就返回这个元素,否则返回False
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.NAME,'tj_trnews')))
#判断某个元素是否被选中,一般用在下拉列表
WebDriverWait(driver,10).until(EC.element_to_be_selected(driver.find_element(By.xpath,'//input[@type="checkbox"]')))
#判断页面上是否存在alert,如果有就切换到alert并返回alert的内容
WebDriverWait(driver,10).until(EC.alert_is_present())
from selenium import webdriver
options = webdriver.FirefoxOptions()
options.add_argument('-headless')
browser = webdriver.Firefox(firefox_options=options)
browser.get('http://httpbin.org/get')
Chrome_options = webdriver.ChromeOptions()
Chrome_options.add_argument('-headless')
drive = webdriver.Chrome(chrome_options=Chrome_options)
drive.get('http://httpbin.org/get')
级别 | 使用范围 | 值 |
---|---|---|
CRITICAL | 严重错误,程序本身可能无法继续运行 | 50 |
ERROR | 现更严重的问题,软件无法执行某些功能 | 40 |
WARNING | 意想不到的事情发生了,或预示着某个问题。但软件仍按预期运行。 | 30 |
INFO | 确认代码运行正常 | 20 |
DEBUG | 详细信息,用于诊断问题 | 10 |
# -*- coding: utf-8 -*-
# @Author : 码上开始
import logging
# 设置日志输出的等级,这样的话就能输出debug及以上的日志
# logging.basicConfig(level="DEBUG")
logging.debug("info信息")
logging.info("info信息")
logging.warning("warning信息")
logging.error("error")
logging.critical("critical")
warning信息
error
critical
# -*- coding: utf-8 -*-
# @Author : 码上开始
import logging
# 定制日志打印格式
fmt = "%(name)s-%(levelname)s %(asctime)s %(message)s"
logging.basicConfig(level="DEBUG", format=fmt)
logging.debug("debug信息")
logging.info("info信息")
logging.warning("warning信息")
logging.error("error")
logging.critical("critical")
运行结果
root-DEBUG 2021-01-23 17:14:57,553 debug信息
root-INFO 2021-01-23 17:14:57,553 info信息
root-WARNING 2021-01-23 17:14:57,553 warning信息
root-ERROR 2021-01-23 17:14:57,553 error
root-CRITICAL 2021-01-23 17:14:57,553 critical
# -*- coding: utf-8 -*-
# @Author : 码上开始
import logging
# 创建日志器对像
log = logging.getLogger("码上开始")
# -*- coding: utf-8 -*-
# @Author : 码上开始
import logging
# 定义日志器
log = logging.getLogger()
# 可设置等级,默认级别为WARNING
# 控制台处理器
console_handle = logging.StreamHandler()
# 处理器级别
# console_handle.setLevel(level="INFO")
# 日志器添加处理器
log.addHandler(console_handle)
log.debug("debug信息")
log.info("info信息")
log.warning("warning信息")
log.error("error")
log.critical("critical")
log.debug("debug信息")
log.info("info信息")
log.warning("warning信息")
# -*- coding: utf-8 -*-
# @Author : 码上开始
import logging
# 定义日志器
log = logging.getLogger()
# 文件处理器
file_handle = logging.FileHandler("./log", mode="a", encoding="utf-8")
# 日志器添加处理器
log.addHandler(file_handle)
log.debug("debug信息")
log.info("info信息")
log.warning("warning信息")
log.error("error")
log.critical("critical")
# -*- coding: utf-8 -*-
# @Author : 码上开始
import logging
# 定义日志器
log = logging.getLogger("码上开始")
# 定义处理器
console_handle = logging.StreamHandler()
# 定义日志打印格式
fmt = "%(name)s--->%(levelname)s--->%(asctime)s--->%(message)s"
# 创建格式器
get_fmt= logging.Formatter(fmt=fmt)
# 处理器添加格式器
console_handle.setFormatter(get_fmt)
# 日志器添加处理器
log.addHandler(console_handle)
log.debug("debug信息")
log.info("info信息")
log.warning("warning信息")
log.error("error")
log.critical("critica
运行结果:
码上开始--->WARNING--->2021-01-23 19:23:57,898--->warning信息
码上开始--->ERROR--->2021-01-23 19:23:57,899--->error
码上开始--->CRITICAL--->2021-01-23 19:23:57,899--->critical
# -*- coding: utf-8 -*-
# @Author : 码上开始
import logging
# 定义日志器
log = logging.getLogger("码上开始")
# 定义控制台和文本处理器
console_handle = logging.StreamHandler()
file_handle = logging.FileHandler("./log.txt", mode="a", encoding="utf-8")
# 定义日志打印格式
fmt = "%(name)s--->%(levelname)s--->%(asctime)s--->%(message)s"
# 创建格式器
get_fmt= logging.Formatter(fmt=fmt)
# 处理器添加格式器
console_handle.setFormatter(get_fmt)
file_handle.setFormatter(get_fmt)
# 日志器添加处理器
log.addHandler(console_handle)
log.addHandler(file_handle)
log.debug("debug信息")
log.info("info信息")
log.warning("warning信息")
log.error("error")
log.critical("critical")
def __init__(self):
# 日志器
self.log = logging.getLogger("码上开始")
def ConsoleHadle(self, level="WARNING"):
"""控制台处理器"""
# 创建控制台处理器
self.console_handler = logging.StreamHandler()
# 设置处理器等级
self.console_handler.setLevel(level)
# 处理器添加格式器
self.console_handler.setFormatter(self.getFormater()[0])
# 返回控制台处理器
return self.console_handler
def FileHandle(self, level="DEBUG"):
"""文件处理器"""
# 创建文件处理器
self.file_handler = logging.FileHandler("./log.txt", mode="a", encoding="utf-8")
# 设置处理器等级
self.file_handler.setLevel(level)
# 处理器添加格式器
self.file_handler.setFormatter(self.getFormater()[1])
# 返回文件处理器
return self.file_handler
def getFormater(self):
"""格式器"""
# 定义输出格式
self.console_fmt = logging.Formatter(fmt="%(name)s--->%(levelname)s--->%(asctime)s--->%(message)s")
self.file_fmt = logging.Formatter(fmt="%(levelname)s--->%(asctime)s--->%(message)s")
# 返回格式器,第2个步骤中调用添加格式器
return self.console_fmt, self.file_fmt
def get_log(self):
# 日志添加控制台处理器
self.log.addHandler(self.ConsoleHadle())
# 日志添加文件处理器
self.log.addHandler(self.FileHandle())
return self.log
# -*- coding: utf-8 -*-
# @Author: 一凡
import logging
class Log():
def __init__(self, level="DEBUG"):
# 日志器
self.log = logging.getLogger("test")
self.log.setLevel(level)
def console_handle(self, level="DEBUG"):
"""控制台处理器"""
self.console_handler = logging.StreamHandler()
self.console_handler.setLevel(level)
# 处理器添加格式器
self.console_handler.setFormatter(self.get_formatter()[0])
return self.console_handler
def file_handle(self, level="DEBUG"):
"""文件处理器"""
self.file_handler = logging.FileHandler("./log.txt", mode="a", encoding="utf-8")
self.file_handler.setLevel(level)
# 处理器添加格式器
self.file_handler.setFormatter(self.get_formatter()[1])
return self.file_handler
def get_formatter(self):
"""格式器"""
# 定义输出格式
self.console_fmt = logging.Formatter(fmt="%(name)s--->%(levelname)s--->%(asctime)s--->%(message)s")
self.file_fmt = logging.Formatter(fmt="%(levelname)s--->%(asctime)s--->%(message)s")
return self.console_fmt, self.file_fmt
def get_log(self):
# 日志器添加控制台处理器
self.log.addHandler(self.console_handle())
# 日志器添加文件处理器
self.log.addHandler(self.file_handle())
return self.log
#实列化类
log = Log()
a = log.get_log()
a.debug("开始打印")
Page Object Model (POM) 直译为“页面对象模型”,这种设计模式旨在为每个待测试的页面创建一个页面对象(class),将那些繁琐的定位操作封装到这个页面对象中,只对外提供必要的操作接口,是一种封装思想。
#! /usr/bin/python3
#-*- coding:utf-8 -*-
'''管理登录页面所有的元素,操作这些元素的方法'''
from selenium.webdriver.common.by import By
class LoginPage:
username_input = (By.XPATH,'//*[@id="name"]') #登录页面的用户名输入框
password_input = (By.XPATH,'//*[@id="password"]') #登录页面的密码输入框
login_button = (By.XPATH,'//*[@id="submit"]') #登录按钮
#! /usr/bin/python3
#-*- coding:utf-8 -*-
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
'''封装一些常用公共方法'''
class InitBrowser():
'''浏览器常用操作封装'''
def __init__(self):
self.driver = webdriver.Firefox() # 启动谷歌浏览器
self.driver.get('https://sso.kuaidi100.com/sso/authorize.do') # 打开网站
def wait_element_visible(self, locate):
ele = WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located(locate)) #等待元素出现再去操作
print('等待元素出现')
return ele
def click_until_visible(self, locate):
self.wait_element_visible(locate).click()
def send_keys_until_visible(self, locate, value):
self.wait_element_visible(locate).send_keys(value)
#! /usr/bin/python3
#-*- coding:utf-8 -*-
'''管理测试用例'''
import unittest
from common import InitBrowser
# 导入Pages文件下的login_page文件中的LoginPage类
from Pages.login_page import LoginPage
class TestCases(unittest.TestCase, InitBrowser, LoginPage):
def setUp(self) -> None:
'''前置操作初始化:打开浏览器,连接数据库,初始化数据'''
InitBrowser.__init__(self)
def testcase01(self):
'''测试用例'''
self.send_keys_until_visible(LoginPage.username_input, "账号")
self.send_keys_until_visible(LoginPage.password_input, "密码")
self.click_until_visible(LoginPage.login_button)
def tearDown(self) -> None:
'''后置操作:关闭浏览器,关闭数据库连接,清理测试数据'''
self.driver.quit()
if __name__=='__main__':
unittest.main()
测试用例,方法命名基于test开头,测试用例自行排序执行顺序规则A-Z, a-z, 0-9
如用例test01/test02
add的用例不是用test开始就不会被识别,所以不会运行
# -*- coding: utf-8 -*-
# @Author : 一凡
import unittest
class TestHC(unittest.TestCase):
def test01(self):
print("用例1")
def test02(self):
print("用例2")
def add(self):
"""当前用例不会被执行"""
print("用例3")
if __name__ == '__main__':
unittest.main()
# 运行结果
..
OK
用例1
用例2
.
失败是 F
,出错是 E
# -*- coding: utf-8 -*-
# @Author : 一凡
import unittest
class TestHC(unittest.TestCase):
def setUp(self) -> None:
print("打开浏览器")
def test01(self):
print("用例1")
def test02(self):
print("用例2")
def tearDown(self) -> None:
print("关闭浏览器")
if __name__ == '__main__':
unittest.main()
# 运行结果
打开浏览器
用例1
关闭浏览器
打开浏览器
用例2
关闭浏览器
# -*- coding: utf-8 -*-
# @Author : 一凡
import unittest
class TestHC(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
print("打开浏览器")
def test01(self):
print("用例1")
def test02(self):
print("用例2")
@classmethod
def tearDownClass(cls) -> None:
print("关闭浏览器")
if __name__ == '__main__':
unittest.main()
# 运行结果
打开浏览器
用例1
用例2
关闭浏览器
方式一:加载测试用例
# -*- coding: utf-8 -*-
# @Author : 一凡
import unittest
class TestHC(unittest.TestCase):
def test01(self):
print("用例1")
def test02(self):
print("用例2")
if __name__ == '__main__':
"""方式1添加单条用例"""
# 创建suite实例
suite = unittest.TestSuite()
# 添加单条测试用例
suite.addTest(TestHC("test02")) # addTest()里参数格式为:测试类('测试方法')
suite.addTest(TestHC("test01"))
run = unittest.TextTestRunner()
run.run(suite)
"""方式2添加多条用例"""
# 创建suite实例
suite = unittest.TestSuite()
"""方式2添加多条用例"""
# addTests 复数
suite.addTests([TestHC('test02'), TestHC('test01')])
run = unittest.TextTestRunner()
run.run(suite)
方式二:加载测试用例类
# -*- coding: utf-8 -*-
# @Author : 一凡
import unittest
class Test(unittest.TestCase):
def test01(self):
print("用例1")
def test02(self):
print("用例2")
class Test1(unittest.TestCase):
def test03(self):
print("用例3")
def test04(self):
print("用例4")
if __name__ == '__main__':
"""添加单条用例"""
# 创建suite实例
suite = unittest.TestSuite()
loader = unittest.TestLoader()
# 加载用例
suite.addTest(loader.loadTestsFromTestCase(Test))
suite.addTest(loader.loadTestsFromTestCase(Test1))
run = unittest.TextTestRunner()
run.run(suite)
"""
# 加载用例
suite1 = loader.loadTestsFromTestCase(Test)
suite2 = loader.loadTestsFromTestCase(Test1)
# 用例添加到套件中
suites = unittest.TestSuite([suite1, suite2])
# 运行用例
run = unittest.TextTestRunner()
run.run(suites)
"""
方法三:加载指定路径里的测试用例
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wI6KlwyE-1634193811891)(C:\Users\zhichao\AppData\Roaming\Typora\typora-user-images\image-20210228152457445.png)]
# -*- coding: utf-8 -*-
# @Author : 一凡
import unittest
# discover 可以一次调用多个脚本
# test_dir 用例文件的路径
# pattern 脚本名称匹配规则
test_dir = "D:\\HC\\testcase"
discover = unittest.defaultTestLoader.discover(test_dir, pattern="test*.py")
# 匹配test_case目录下所有以test开头的py文件,执行这些py文件下的所有测试用例
if __name__ == "__main__":
runner = unittest.TextTestRunner()
runner.run(discover)
# 创建TextTestRunner实例
runner = unittest.TextTestRunner()
# 使用run()方法运行测试套件(即运行测试套件中的所有用例)
runner.run(suite)
94行引入的名称要改,从 import StringIO修改成 import io
539行 self.outputBuffer = StringIO.StringIO()修改成self.outputBuffer=io.StringIO()
631行 print >>sys.stderr, ‘\nTime Elapsed: %s’ % (self.stopTime-self.startTime)修改成print (sys.stderr, - ‘\nTime Elapsed: %s’ %(self.stopTime-self.startTime))
642行,if not rmap.has_key(cls): 修改成 if not cls in rmap:
766行的uo = o.decode(‘latin-1’),修改成 uo=o
772行,把 ue = e.decode(‘latin-1’) 直接改成 ue = e
# -*- coding: utf-8 -*-
# @Author : 一凡
import time
import unittest
import HTMLTestRunner
# 获取当前时间并指定时间格式,用于测试报告命名
now = time.strftime("%Y-%m-%d_%H_%M_%S")
# 测试报告存储路径
report_dir = 'D:\\HC\\report\\'
# 创建报告文件,并以写的形式打开文件,用于写入报告内容
fp = open(report_dir + now + "result.html", 'wb')
# 初始化一个HTMLTestRunner实例对象,用来生成报告
runner = HTMLTestRunner.HTMLTestRunner(stream=fp,
title="web自动化测试报告",
description="测试用例情况")
# 定义测试用例路径
test_dir='./testcase'
# 加载测试用例
dis = unittest.defaultTestLoader.discover(test_dir, pattern='test_*.py')
# 执行测试用例
runner.run(dis)
fp.close()
序号 | 方法 | 用途 |
---|---|---|
1 | assertEqual(a, b) | 核实 a == b |
2 | assertNotEqual(a, b) | 核实 a != b |
3 | assertTrue(x) | 核实 x 为 True |
4 | assertFalse(x) | 核实 x 为 False |
5 | assertIn( item , list ) | 核实 item 在 list 中 |
6 | assertNotIn( item , list ) | 核实 item 不在 list 中 |
# -*- coding: utf-8 -*-
# @Author : 一凡
import unittest
class Test(unittest.TestCase):
def test01(self):
"""核实 a == b"""
a = 1
self.assertEqual(a, 1)
def test02(self):
"""核实 a != b"""
a = 1
self.assertNotEqual(a, 2)
def test03(self):
"""核实 x 为 True"""
self.assertTrue(True)
def test04(self):
"""核实 x 为 False"""
self.assertTrue(type(0))
def test05(self):
"""核实item在list 中"""
self.assertIn(1, [1, 2, 3])
def test06(self):
"""核实item不在list 中"""
self.assertNotIn(0, [1, 2, 3])
if __name__ == '__main__':
unittest.main()
# -*- coding: utf-8 -*-
# @Author : 一凡
import unittest
class Test(unittest.TestCase):
@unittest.skip(reason="无条件跳过此用例")
def test_1(self):
print("测试1")
@unittest.skipIf(True, reason="为True的时候跳过")
def test_2(self):
print("测试2")
@unittest.skipUnless(False, reason="为False的时候跳过")
def test_3(self):
print("测试3")
@unittest.expectedFailure
def test_4(self):
print("测试4")
self.assertEqual(2, 4, msg="判断相等")
if __name__ == "__main__":
unittest.main()
如果想学习软件测试,就快加入:893694563,群内学软件测试,分享技术和学习资料,陪你一起成长和学习。