设计模式
数据驱动:数据和程序分离
关键字驱动:动作+被测元素+操作值
行为驱动:通过自然语言,执行测试用例
混合驱动:数据驱动+关键字驱动
分布式:在不同机器上运行
xpath
使用路径表达式选取xml文档中的节点或者节点集
找到被测试对象,操作对象,验证测试结果(断言)
HTML和XML的区别
HTML是特殊的XML,HTML的标签在浏览器进行过预定义,所以可以被渲和解析的
xpath中有七种类型的节点
元素、属性、文本、命名空间、处理指令、注释以及文档根节点
XML文档是被作为节点树来对待的,树的根被成文文档节点或者根节点
节点:标签
基本值 无父或无子的节点
父节点:每个元素和属性都有一个父节点
选取节点
nodename 选取此节点的所有子节点
/ 从根节点选取
// 从匹配选择当前节点选择文档中的节点,从而不考虑他们的位置
. 选取当前节点
… 选取当前节点的父节点
@ 选取属性
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<title>测试网页</title>
</head>
<body>
<div id=div1>
<p>今天天气不错</p>
<p>挺风和日丽的</p>
<p>我们下午没有课</p>
</div>
<div id=div2 name="测试">
<p>今天天气不错<span>但是我在上课</span></p>
<p>挺风和日丽的</p>
<p>我们下午没有课<input type="text" name="">文本内容</input></p>
</div>
</body>
</html>
//* 定位找到所有元素
//input 定位指定元素
//[@] 定位属性的元素
//[@id] 定位id的元素
//[@id=“div1”] 定位某个id的元素
//[@id="div2"and@name=“测试”] 2个属性定位唯一的元素
//[@id!=“div2”] 定位不等于某个属性
//[contains(@name,“测”)] 包含模糊定位元素
//[.=“挺风和日丽的”] 定位文本
//div[@id=“div1”]/*[.=“挺风和日丽的”] 准确定位元素
xpath实战
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
search_box = driver.find_element_by_xpath("//*[@id='kw']")
search_box.send_keys("测试")
query_button = driver.find_element_by_xpath("//*[@id='su']")
query_button.click()
time.sleep(5)
assert "测" in driver.page_source
driver.quit()
设计模式
数据驱动
程序不变,数据变,做到了程序和数据的分类,测试人员只要维护测试数据就可以了
数据文件test.txt
http://www.baidu.com
https://www.w3school.com.cn/
https://www.bilibili.com/
程序文件stest.py
from selenium import webdriver
import time
driver = webdriver.Chrome() # 创建Chrome对象
# driver = webdriver.Firefox()
with open("test.txt",encoding="utf-8") as fp:
for i in fp:
print(i)
driver.get(i)
time.sleep(5) # 5秒后关闭
driver.quit()
关键字驱动
一个关键字,能够映射到Python程序中的函数执行,关键字可以放在数据文件中,关键字驱动,所有动作都是分开的,关键字可以基于别的关键字进行封装
关键字模型
动作||定位表达式||操作值||断言值
关键字文件test.txt
visit||http://www.baidu.com
visit||https://www.w3school.com.cn/
visit||https://www.bilibili.com/
keytest.py
from selenium import webdriver
import time
def visit(url):
global driver
driver.get(url)
time.sleep(5)
driver = webdriver.Chrome()
with open("test.txt") as fp:
for line in fp:
if line.strip()!="":
action,url = line.split("||")
url = url.strip()
eval(action + "('" + url + "')")
混合驱动
数据+关键字
关键字文件test.txt
visit||http://www.baidu.com
visit||{testx.txt}
数据文件textx.txt
http://www.baidu.com
https://www.w3school.com.cn/
https://www.bilibili.com/
hhtest.py
from selenium import webdriver
import re,time
# 关键字映射函数
def visit(url):
global driver
driver.get(url)
time.sleep(3)
driver = webdriver.Chrome()
with open("test.txt") as fp:
for line in fp:
if re.search(r"\{(.*?)\}",line):
data_file = re.search(r"\{(.*?)\}",line).group(1)
with open(data_file) as fp:
for data in fp:
if data.strip() != "":
action = line.split("||")[0]
data = data.strip()
eval(action + "('" +data+ "')")
elif line.strip()!= "":
action,url = line.split("||")
url=url.strip()
eval(action+"('"+url+"')")
常用方法
webdriver
from selenium import webdriver
driver = webdriver.Chrome()
get()
打开网页
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
back() forward()
后退,前进
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.get("https://www.bilibili.com")
driver.back()
driver.forward()
find_element_by_id()
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.find_element_by_id("kw") # <selenium.webdriver.remote.webelement.WebElement (session="180af6801677443ed827ce068badec20", element="13dac842-0f5b-4374-b4e4-431c7e5cf46e")>
find_element_by_xpath()
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.find_element_by_xpath("//*[@id='kw']") # <selenium.webdriver.remote.webelement.WebElement (session="180af6801677443ed827ce068badec20", element="13dac842-0f5b-4374-b4e4-431c7e5cf46e")>
find_element_by_name()
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.find_element_by_name("wd") #<selenium.webdriver.remote.webelement.WebElement (session="3499eef4c0a7ba82052e2ef788eb9f89", element="f53b6f1a-6334-40bd-a618-13f7e0114af4")>
注意 find_elements_by_name() elements可以找到多个元素,返回列表,可以用坐标取
send_keys()
输入内容
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.find_element_by_id("kw").send_keys("北京")
click()
点击
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.find_element_by_id("kw").send_keys("北京")
driver.find_element_by_id("su").click()
close()
关闭当前标签
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.close()
quit()
退出浏览器
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.quit()
refresh()
刷新页面
driver.refresh()
注意:刷新或者页面跳转之后之前获取的元素都不能使用了,需要重新获取
title
查看标题
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.title # '百度一下,你就知道'
assert "百度一下,你就知道" in driver.page_source #断言某个数据在不在
常用定位方式
id
name
xpath