config-配置文件
data-测试数据
download-下载的数据
drivers-驱动文件
HTML-测试用的页面
log-日志文件
report-测试报告
test-测试文件
common-公共方法
pages-每个页面一个page class
case-测试用例
runner-对测试用例进行组织
utils-存放一些方法
HTMLTestRunner-测试报告使用
readConfig-读取配置文件
公共方法篇
config
base_data.json
{
"base_url": "http://localhost:21248/#/",
"email": "admin@tynam.com",
"password": "tynam123"
}
utils
readConfig.py
对配置文件读取进行封装
# -*-coding:utf-8-*-
import json
class ReadConfig(object):
"""
读取配置文件,Excel、json等文件的读取方法都可写在次类下
"""
def __init__(self):
pass
def read_json(self, json_file):
"""读取json文件"""
try:
with open(json_file) as f:
data = json.load(f)
return data
except:
print("文件不存在或不是json文件")
if __name__ == '__main__':
data = ReadConfig().read_json("../config/base_data.json")
print(data)
print(data['base_url'], data['email'], data['password'])
输出结果
test
common
elementIsExist.py
判断元素是否存在
# -*-coding:utf-8-*-
class ElementIsExist(object):
def __init__(self, driver):
self.driver = driver
def is_exist(self, element):
flag = True
try:
self.driver.find_element_by_css_selector(element)
return flag
except:
flag = False
return flag
test
common
tabOperation.py
tab切换
# -*-coding:utf-8-*-
from time import sleep
from test.common.elementIsExist import ElementIsExist
class TableOperation(object):
"""Tab操作"""
def __init__(self, driver):
self.driver = driver
def get_all_tab(self):
"""获取所有的tab"""
sleep(1)
# 获取所有的tab父元素
# 元素定位,我们默认取css定位
fathers_tabs = [['.tabs1', 'a2'], ['.tabs', 'a'], ]
# 获取页面显示父节点下的所有tab
for father_tab in fathers_tabs:
# 使用is_exist()方法判断父节点是否存在,如果父节点不存在,则查找的tab不匹配
father_exist = ElementIsExist(self.driver).is_exist(father_tab[0])
# 父节点存在,则进行操作
if father_exist:
father = self.driver.find_element_by_css_selector(father_tab[0])
tabs = father.find_elements_by_css_selector(father_tab[1])
return tabs
def switch_tab(self, tab_text):
"""
切换tab
:param tab_text: 需要切换到的tab内容
:return:
"""
tabs = self.get_all_tab()
for tab in tabs:
if tab.text == tab_text:
tab.click()
return
"""
测试代码
if __name__ == '__main__':
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://localhost:63342/AutoTestExample-Heyb-Project/HTML/tab/index.html')
sleep(2)
tab = TabOperation(driver)
tab.switch_tab('Tab2')
sleep(2)
tab.switch_tab('Tab3')
sleep(3)
driver.quit()
"""
test
common
multiMenuOperation.py
多级菜单
# -*-coding:utf-8-*-
from time import sleep
from test.common.elementIsExist import ElementIsExist
class MultiMenuOperation(object):
"""多级菜单操作"""
def __init__(self, driver):
self.driver = driver
def get_all_menu(self):
"""获取所有菜单"""
driver = self.driver
sleep(1)
# 获取所有的tab父元素
fathers_menus = [['#nav', '#nav>ul>li>a', '#nav>ul>li ul>li>a'],
['#nav1', 'a', 'div'],
]
# 获取页面显示父元素下的所有菜单
menu_level = []
for father_menu in fathers_menus:
# 使用is_exist方法确定一级菜单的父元素在页面中出现
father_exist = ElementIsExist(driver).is_exist(father_menu[0])
if father_exist:
# 将第一级菜单添加到list中的第一个元素
if ElementIsExist(driver).is_exist(father_menu[1]):
menu_level_1 = driver.find_elements_by_css_selector(father_menu[1])
menu_level.append(menu_level_1)
# 将第二级菜单添加到list中的第二个元素
if ElementIsExist(driver).is_exist(father_menu[2]):
menu_level_2 = driver.find_elements_by_css_selector(father_menu[2])
menu_level.append(menu_level_2)
return menu_level
return menu_level
def select_menu(self, menu_text=[]):
"""
选择菜单
:param menu_text: 必须是list
:return:
"""
menu_levels = self.get_all_menu()
i = 0
for menus in menu_levels:
for menu in menus:
if menu.text == menu_text[i]:
sleep(1)
menu.click()
i += 1
break
"""
测试代码
if __name__ == '__main__':
from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('http://localhost:63342/AutoTestExample-Heyb-Project/HTML/multiMenu/index.html')
sleep(1)
menu = MultiMenuOperation(driver)
menu.select_menu(["链接", "必应"])
sleep(3)
driver.quit()
"""
test
common
tableOperation.py
表格结构
# -*-coding:utf-8-*-
from time import sleep
from test.common.elementIsExist import ElementIsExist
class TableOperation(object):
"""表格操作"""
def __init__(self, driver):
self.driver = driver
def get_table(self):
"""获取table
返回table的headers、body_rows和body_rows_column
"""
sleep(1)
# 列表顺序:table、header、body_rows和body_rows_column
tables_header_body = [['table #dataArea>table',
'table #dataArea>table>.header>td',
"table #dataArea>table>tr:not(.header)",
"table #dataArea>table>tr:not(.header)>td"],
]
# 获取画面显示的table
for table_header_body in tables_header_body:
# 如果找到的父节点为空,则父节点不存在,则查找的table不匹配,页面中不存在
if ElementIsExist(self.driver).is_exist(table_header_body[0]):
table = self.driver.find_element_by_css_selector(table_header_body[0])
headers = table.find_elements_by_css_selector(table_header_body[1])
body_rows = table.find_elements_by_css_selector(table_header_body[2])
rows = []
for body_row in body_rows:
body_row_column = body_row.find_elements_by_css_selector(table_header_body[3])
rows.append(body_row_column)
return headers, rows
else:
print("table定位失败")
def select_row(self, header_text, row_text):
"""
根据header中的列获取对应的body中的行
:param header_text: header中列内容
:param row_text: leader列对应的body列内容
:return: 返回body中的行
"""
headers, rows = self.get_table()
# 获取传入的header的index
idx = int()
for header in headers:
if header.text == header_text:
idx = headers.index(header)
# 通过index在body中寻找相应的index的内容
for row in rows:
if row[idx].text == row_text:
return row
def row_click(self, header_text, row_text):
"""选择表格中行并且单击"""
row = self.select_row(header_text, row_text)
# 返回的row是一个list,driver不能进行单击操作,所以需要给具体的值
# 如果返回的row中有button,可以给出button的index实现row中button单击
return row[0].click()
test
common
pagingOperation.py
分页
# -*-coding:utf-8-*-
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from time import sleep
class PagingOperation(object):
"""Tab操作"""
def __init__(self, driver):
self.driver = driver
# 对分页中每个操作元素进行定位
# 分页
self.paging = self.driver.find_element(By.CLASS_NAME, 'pagination')
# 首页
self.first = self.driver.find_element(By.CLASS_NAME, 'first')
# 上一页
self.previous = self.driver.find_element(By.CLASS_NAME, 'previous')
# 下一页
self.next = self.driver.find_element(By.CLASS_NAME, 'next')
# 末页
self.last = self.driver.find_element(By.CLASS_NAME, 'last')
# 输入页数
self.input = self.driver.find_element(By.CSS_SELECTOR, 'input')
def paging_operation(self, text=None):
"""分页操作"""
sleep(1)
if text == "首页" or text == "第一页":
return self.first.click()
elif text == "上一页":
return self.previous.click()
elif text == "下一页":
return self.next.click()
elif text == "末页" or text == "最后一页":
return self.last.click()
elif type(text) == int:
self.input.click()
self.input.send_keys(text)
self.input.send_keys(Keys.ENTER)
else:
error = "只接受首页、第一页、上一页、下一页、末页、最后一页和整型数字"
print(error)
return
"""
测试代码
if __name__ == '__main__':
from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('http://localhost:63342/AutoTestExample-Heyb-Project/HTML/paging/index.html')
sleep(3)
paging = PagingOperation(driver)
paging.paging_operation(5)
paging.paging_operation("上一页")
paging.paging_operation("下一页")
paging.paging_operation("首页")
paging.paging_operation("末页")
sleep(3)
driver.quit()
"""