locator: 定位器
数据类型,元组
("元素定位方式","对应的定位方式值")
元素的定位方式: 8种
"id","class name","partial link text"
对应的定位方式值:
id属性值
xpath/css表达式
示例:("id","userA") ("class name","telA") ("link text","访问 新浪 网站") ("partial link text","访问") ("css selector","css表达式")
WebDriverWait(driver, 10).until(EC.presence_of_element_located(locator)) # 元素定位--单个元素
WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located(locator)) # 元素定位--单个元素
一个脚本就是一个完整的场景
一个脚本只验证一个功能点
脚本尽量只做正向逻辑验证
正向逻辑≠正确数据
脚本之间不要产生关联,每个脚本都可以独立运行
脚本只对验证点进行验证,不对脚本中每一步骤做验证
pom模式是页面自动化的一个常用的模式;Page Object Module页面 对象 模型
一切皆对象
把项目中的每一个页面当做一个对象
把每个页面分为三层
表现层
页面上可见的所有元素
操作层
对页面上所有可见元素的操作(点击,清空,输入)
业务层
对元素操作后所实现的功能
项目名称
common文件夹 --存放公共方法
base.py --对selenium做二次封装(基础类)
方法名称一定--见名知意,注释不能缺失
打开浏览器
打开网址
元素定位(单个/一组)
元素操作(点击/输入)
关闭浏览器
下拉菜单
alert弹窗
iframe
"""
base.py 对selenium做二次封装
1.打开浏览器
2.输入网址
3.元素定位
4.元素操作
"""
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
def open_browser(browser="chrome"):
"""
打开浏览器
:param browser: 浏览器名称
:return:
"""
if browser == "chrome":
driver = webdriver.Chrome()
elif browser == "firefox":
driver = webdriver.Firefox()
elif browser == "ie":
driver = webdriver.Ie()
else:
print("请输入正确的浏览器名称,例如'Chrome','Firefox','ie'")
driver = None
return driver
class Base:
def __init__(self, driver):
"""
初始化浏览器
:param driver:
"""
self.driver = driver
def open_url(self,url):
"""
打开网址
:param url: 网址
:return:
"""
self.driver.get(url)
# 浏览器最大化
self.driver.maximize_window()
def close(self):
"""
关闭浏览器
:return:
"""
self.driver.quit()
def find_element(self, locator: tuple, timeout=10):
"""
定位单个元素
:param:locator:定位器,元组格式 例如("id","id属性值")
:return:
"""
try:
element = WebDriverWait(self.driver,timeout).until(EC.presence_of_element_located(locator))
return element
except:
print(f"元素{locator}没找到")
return False
def find_elements(self, locator, timeout=10):
"""
定位一组元素
:param locator: 定位器
:param timeout: 最大等待时间
:return:
"""
try:
elements = WebDriverWait(self.driver,timeout).until(EC.presence_of_all_elements_located(locator))
return elements
except:
print(f"元素{locator}没找到")
return False
def click(self,locator):
"""
点击元素
:return:
"""
element = self.find_element(locator)
try:
element.click()
except Exception as msg:
print(msg)
def send_keys(self, locator, text):
"""
输入
:param locator: 定位器,元组
:param text: 需要输入的文本
:return:
"""
element = self.find_element(locator)
try:
element.clear()
element.send_keys(text)
except Exception as msg:
print(msg)
def is_text_in_element(self, locator, text, timeout=10):
"""
判断文本是否在元素的文本中,如果在,返回True,如果不在返回False
:param locator: 定位器,元组
:param text: 文本
:return:
"""
try:
result = WebDriverWait(self.driver, timeout).until(EC.text_to_be_present_in_element(locator,text))
return result
except:
return False
def is_value_in_element(self,locator, value, timeout=10):
"""
判断value值是否是元素value属性对应的值,如果是,返回True,否则返回False
:param locator: 定位器
:param value: 文本
:param timeout:
:return:
"""
try:
result = WebDriverWait(self.driver, timeout).until(EC.text_to_be_present_in_element_value(locator,value))
return result
except:
return False
def is_selected(self,locator):
"""
判断元素是否被选中:如果选中,返回True,否则返回False
"""
element = self.find_element(locator)
try:
result = element.is_selected()
return result
except:
return False
if __name__ == '__main__':
import time
driver = open_browser("chrome")
base = Base(driver)
base.open_url("http://www.baidu.com/")
# 搜索框定位器
search_loc = ("id", "kw1")
# 按钮定位器
button_loc = ("id", "su1")
value = "百度一下"
# 新闻链接定位器
news_loc = ("link text", "新闻1")
text = "新闻"
# # 搜索框输入
# base.send_keys(search_loc,"周琦")
# # 点击百度一下
# base.click(button_loc)
# 判断新闻链接
print(base.is_text_in_element(news_loc, text))
# 判断百度一下按钮
print(base.is_value_in_element(button_loc, value))
time.sleep(3)
base.close()
工具类
operation_excel.py
"""
1.学习目标
掌握封装Excel表格 工具类 功能读取表格
2.操作步骤(语法)
将表格的数据读取成[{},{}...]
字典的键:表格中的第一行
字典的值:表格中的其他行
excel数据 Python数据
1 str
2 整数
3 日期
4 布尔值
3.需求
"""
import xlrd
# 创建工具类,操作Excel表格
class OperationExcel:
def __init__(self,filename):
"""
初始化类,每次传入文件名
:param:filename: 文件路径+文件名
"""
self.table = xlrd.open_workbook(filename)
def get_data_by_index(self,index=0):
"""
通过索引读取数据
:param:index 索引值
:return:
"""
sheet = self.table.sheet_by_index(index)
return self._get_data_info(sheet)
def get_data_by_name(self,name):
"""
通过表名读取数据
:param name:
:return:
"""
sheet = self.table.sheet_by_name(name)
return self._get_data_info(sheet)
def _get_data_info(self,sheet):
"""
获取数据的详情
:param sheet:
:return:
"""
keys = sheet.row_values(0) # 将表格的第一行作为字典的键
rows = sheet.nrows # 获取表中的总行数
cols = sheet.ncols # 获取表中的总列数
data_list = [] # 放置读取的数据
for row in range(1, rows): # 遍历行
value_list = [] # 放置每行的数据
for col in range(cols): # 遍历列
value = self._read_cell(sheet, row, col)
value_list.append(value)
tmp = zip(keys, value_list) # 使用zip函数组合键和值
data_list.append(dict(tmp)) # 将字典添加到列表中
return data_list
def _read_cell(self,sheet,row,col):
"""
处理单元格数据类型
:param sheet:
:return:
"""
# sheet = self.table.sheet_by_index(0)
cell = sheet.cell_value(row,col) # 单元格数据
cell_type = sheet.cell_type(row,col) # 获取单元格的数据类型
if cell_type == 1: # 当单元格数据类型为str
cell = cell # 不对数据做任何处理
elif cell_type == 2 and cell % 1 == 0: # 当单元格数据类型为整数时
cell = int(cell) # 转为int类型
elif cell_type == 4: # 当单元格数据类型布尔值
cell = True if cell == 1 else False # 三目运算符
return cell
if __name__ == '__main__':
oper = OperationExcel("../data/login_data.xls")
# data = oper.get_data_by_index()
data = oper.get_data_by_name("Sheet1")
print(data)
xxxx.py
page文件夹 --一个页面就是一个.py文件
封装页面的表现层和操作层---继承base.py
login_page.py # 登录页面
"""
login_page.py
封装页面的表现层
封装页面的操作层
需要继承base类
"""
from common.base import Base
login_url = "http://ecshop.itsoso.cn/user.php" # 页面地址
class LoginPage(Base):
"""封装表现层: 制作定位器"""
username_loc = ("name", "username") # 用户名输入框
password_loc = ("name", "password") # 密码输入框
remember_loc = ("id", "remember") # 记住密码复选框
submit_loc = ("class name", "us_Submit") # 立即登录按钮
"""
封装操作层: 元素操作
每一个元素的操作,都写成一个方法
低耦合性:
打电话:
1.拿起手机
2.拨号
3.通话
发短信:
1.拿起手机
2.编辑短信
3.发送
封装方法:
1.拿起手机,2.拨号,3.通话,4编辑短信,5.发送
"""
def input_username(self,text):
"""输入用户名"""
self.send_keys(self.username_loc,text)
def input_password(self,text):
"""输入密码"""
self.send_keys(self.password_loc,text)
def click_remember(self):
"""点击记住密码"""
if self.is_selected(self.remember_loc):
pass
else:
self.click(self.remember_loc)
def click_submit(self):
"""点击立即登录"""
self.click(self.submit_loc)
if __name__ == '__main__':
from common.base import open_browser
import time
driver = open_browser()
login = LoginPage(driver) # 实例化loginpage
login.open_url(login_url)
username = "诸葛亮_1"
password = "Test123456"
login.input_username(username) # 输入用户名
login.input_password(password) # 输入密码
login.click_remember() # 点击记住密码
login.click_submit() # 点击立即登录
time.sleep(3) # 观察代码执行效果
login.close()
register_page.py # 注册页面
script文件夹 -- 测试用例
封装页面的业务层(测试用例)
测试用例调用page文件夹中的类
"""
test_login.py
封装业务层
common page script
"""
# 调用page文件夹中的login_page.py
from page.login_page import LoginPage, login_url
from common.base import open_browser
import unittest
class TestLogin(unittest.TestCase):
def setUp(self):
driver = open_browser() # 打开浏览器
self.login = LoginPage(driver) # 实例化LoginPage
self.login.open_url(login_url) # 打开登录地址
def test_login(self, username,password):
"""
测试登录:
用例的操作步骤
"""
# 1.输入用户名
self.login.input_username(username)
# 2.输入密码
self.login.input_password(password)
# 3.点击登录
self.login.click_submit()
"""缺失预期结果"""
if __name__ == '__main__':
login = TestLogin()
login.test_login("诸葛亮_1","Test123456")
data存放测试数据
report存放测试报告
下载
下载 火狐浏览器的一个插件
菜单---->附加组件---->搜索selenium ide---->选第一个下载
录制
打开selenium ide
创建新项目
打开已有项目
关闭selenium
记录并创建新项目
在地址栏中输入被测网址
点击REC---REC图标为红色
操作被测网址
点击停止记录Pause
保存
回放
点击运行当前测试用例/运行所有测试用例
将时间调到最慢
导出代码
在测试用例上右键---->选择Export
选择语言---Python