2020-2-26更新

This commit is contained in:
wuzushun 2020-02-26 15:04:32 +08:00
parent 1225951062
commit 60769f58a7
68 changed files with 2169 additions and 255 deletions

View File

@ -32,3 +32,12 @@ html_report_path = os.path.join(prj_path, 'report', 'html')
# cookie_path
cookie_path = os.path.join(prj_path, 'data', 'cookie_data')
#等待时间
tiny = 0.5
small= 1
middle = 2
long = 5
#c重试次数
RENUM = 0

Binary file not shown.

View File

@ -0,0 +1,29 @@
# -*- coding: utf-8 -*-
# @Time : 2020/2/20 15:27
# @Author : mrwuzs
# @Email : mrwuzs@outlook.com
# @File : applyfromaction.py
# @Software: PyCharm
from public.pages import controlcenterpage
from time import sleep
def submission_apply_from(project_name,dr):
pass
if __name__ == '__main__':
from public.common import pyselenium
from config import globalparam
from public.appmodel.loginaction import Login
dr = pyselenium.PySelenium(globalparam.browser)
dr.max_window()
login = Login(dr).login("hubei01", "1qaz!QAZ")
submission_apply_from("湖北",dr)

View File

@ -10,27 +10,77 @@ import allure
from time import sleep
from public.pages import controlcenterpage
from public.common import log
from public.appmodel import applyfromaction
class CloudHostAction():
def __init__(self, driver):
self.dr = driver
self.chpg = controlcenterpage.CloudHostPage(self.dr)
self.cs = controlcenterpage.ShoppingcarPage(self.dr)
self.log = log.Log()
def into_pv_cloudhost(self):
def into_pv_cloudhost(self,projectname):
try:
self.chpg.mova_to_menu_bar()
self.chpg.move_to_project_view_button()
self.chpg.click_project_view_button()
sleep(2)
# self.chpg.click_cloud_host_snap_button()
# self.chpg.move_to_project_cloud_host_button()
self.chpg.click_control_center_button()
self.chpg.open_pv_cloudhost(projectname)
# self.chpg.click_control_center_button()
except Exception as e:
self.log.error("进入云主机模块失败:%s"%e)
def create_cloud_host(self,hostname,**args):
self.log.debug("创建虚拟机")
try:
self.chpg.click_apply_cloudhost_button()
if "vpool" in args:
self.chpg.click_box_vpool()
self.chpg.input_and_search_box_vpool(args["vpool"])
if "ipversion" in args:
self.log.debug("选择ip版本")
if args["ipversion"] == "6":
self.chpg.click_ipv6_button()
else:
self.chpg.click_ipv4_button()
if "subnetname" in args:
self.log.debug("选择子网")
self.chpg.click_subnet_box()
self.chpg.input_and_select_subnet(args["subnetname"])
if "ipaddress" in args:
self.log.debug("选择IP地址")
self.chpg.click_ip_box()
self.chpg.input_and_select_ip(args["ipaddress"])
if "cpu" in args:
self.chpg.input_cpu(args["cpu"])
if "mem" in args:
self.chpg.input_mem(args["mem"])
if "boot_disk" in args:
self.chpg.input_boot_disk(args["boot_disk"])
if "data_disk" in args:
self.chpg.select_data_disk_button()
self.chpg.input_data_disk_size(args["data_disk"])
self.chpg.input_cloud_host_name(hostname)
if "host_num" in args:
host_count = args["host_num"]
while host_count -1 :
host_count = host_count -1
self.chpg.click_add_host_num()
self.chpg.click_entry_form_button()
sleep(2)
self.chpg.click_confirmation_form_button()
self.cs.page_to_bottom()
sleep(1)
self.cs.click_submission_apply_form()
except Exception as e:
self.log.error("创建虚拟机失败:%s"%e)
if __name__ == '__main__':
from public.common import pyselenium
@ -41,8 +91,9 @@ if __name__ == '__main__':
dr.max_window()
login = Login(dr).login("hubei01", "1qaz!QAZ")
ch = CloudHostAction(dr)
ch.into_pv_cloudhost()
sleep(1)
ch.into_pv_cloudhost("湖北")
ch.create_cloud_host(hostname="bei02",vpool="湖北",cpu="4",mem="4",boot_disk="10",data_disk="200")
sleep(6)
dr.quit()

View File

@ -0,0 +1,243 @@
# -*- coding: utf-8 -*-
# @Time : 2020/2/23 9:45
# @Author : mrwuzs
# @Email : mrwuzs@outlook.com
# @File : folderaction.py
# @Software: PyCharm
import allure
from time import sleep
from public.pages import folderpage
from public.common import log
from config import globalparam
class FolderAction(object):
def __init__(self, driver):
self.dr = driver
self.log = log.Log()
self.pdclasspage = folderpage.ProdCategPage(self.dr)
self.pdmanagepage = folderpage.ProductManagePage(self.dr)
self.spmanage = folderpage.SpecificationPage(self.dr)
class ProdCategAction(FolderAction):
def create_product_class(self,classname,classnum,classdes,prodclass):
try:
self.pdclasspage.open_prod_catg_page()
sleep(1)
self.pdclasspage.click_new_create_prod_button()
self.pdclasspage.input_systematic_name(classname)
self.pdclasspage.input_systematic_number(classnum)
sleep(1)
self.pdclasspage.click_produc_category_icon()
sleep(2)
if prodclass == "裸金属服务器":
self.pdclasspage.click_bare_metal_server_icon()
elif prodclass == "云主机":
self.pdclasspage.click_cloud_host_icon()
elif prodclass == "云磁盘":
self.pdclasspage.click_cloud_disk_icon()
elif prodclass == "物理资源":
self.pdclasspage.click_phy_res_icon()
elif prodclass =="负载均衡":
self.pdclasspage.click_loadbalance_icon()
elif prodclass == "公网IP":
self.pdclasspage.click_public_ip_icon()
elif prodclass == "云主机备份":
self.pdclasspage.click_cloud_host_backup_icon()
elif prodclass == "容器服务":
self.pdclasspage.click_container_service_icon()
elif prodclass == "外网带宽":
self.pdclasspage.click_bandwidth_icon()
else:
self.log.error("产品分类:%s 不在可选列表中"%prodclass)
self.pdclasspage.click_commit_button()
self.pdclasspage.input_describ(classdes)
self.pdclasspage.click_submit_button()
except Exception as e:
self.log.error("创建产品分类错误:%s"%e)
def delete_product_class(self,classname):
pass
def search_product_class(self,classname):
try:
self.pdclasspage.open_prod_catg_page()
self.pdclasspage.select_product_class(classname)
data = self.pdclasspage.get_table_text()
return data
except Exception as e:
self.log.error("异常错误:%s"%e)
return None
class ProductManageAction(FolderAction):
def create_product(self,productclass,platform,resourcetype,productname,productbnum,description):
try:
self.pdmanagepage.open_product_manage_page()
sleep(globalparam.middle)
self.pdmanagepage.click_create_product_button()
sleep(globalparam.tiny)
self.pdmanagepage.click_product_class_box()
self.pdmanagepage.select_product_class_name(productclass)
self.pdmanagepage.click_platform_box()
self.pdmanagepage.select_platform(platform)
self.pdmanagepage.click_resource_type_box()
self.pdmanagepage.select_resource_type(resourcetype)
self.pdmanagepage.input_product_name(productname)
self.pdmanagepage.input_product_num(productbnum)
#目前都一样选择第一个
self.pdmanagepage.click_get_url_button()
sleep(globalparam.tiny)
self.pdmanagepage.click_cloud_res_openup_button()
self.pdmanagepage.page_to_bottom()
sleep(globalparam.tiny)
self.pdmanagepage.click_commit_button()
self.pdmanagepage.input_product_des(description)
sleep(globalparam.tiny)
self.pdmanagepage.click_save_button()
sleep(globalparam.tiny)
self.pdmanagepage.click_save_button()
except Exception as e:
self.log.error("创建产品失败:%s"%e)
def product_online(self,productname):
try:
self.pdmanagepage.open_product_manage_page()
self.pdmanagepage.select_product(productname)
self.pdmanagepage.click_more_button()
sleep(globalparam.middle)
self.pdmanagepage.click_online_button()
self.pdmanagepage.click_common_confirm_button_tag_a()
except Exception as e:
self.log.error("异常错误:%s,产品上线失败"%e)
def product_offline(self,productname):
try:
self.pdmanagepage.open_product_manage_page()
self.pdmanagepage.select_product(productname)
self.pdmanagepage.click_more_button()
sleep(globalparam.tiny)
self.pdmanagepage.click_offline_button()
self.pdmanagepage.click_common_confirm_button_tag_a()
except Exception as e:
self.log.error("下线失败:%s"%e)
def search_product(self,productname):
try:
self.pdmanagepage.open_product_manage_page()
self.pdmanagepage.select_product(productname)
data = self.pdclasspage.get_table_text()
return data
except Exception as e:
self.log.error("查询失败:%s,异常错误")
class SpecificationAction(FolderAction):
#sp简称规格
def create_specification(self,productname,spname,sptype,spdes,vpool,**kwargs):
try:
self.spmanage.open_specification_page()
self.spmanage.click_create_sp_button()
sleep(globalparam.small)
self.spmanage.select_product_name(productname)
self.spmanage.input_spn_name(spname)
if sptype == 2:
self.spmanage.click_new_create_box()
elif sptype == 1:
self.spmanage.click_change_box()
else:
pass
if "sptag" in kwargs:
self.spmanage.input_sp_tag(kwargs["sptag"])
self.spmanage.input_sp_des(spdes)
self.spmanage.click_next_step_button()
sleep(globalparam.middle)
self.spmanage.page_to_bottom()
self.spmanage.select_vpool(vpool)
if "volume_type" in kwargs:
self.spmanage.input_volume_type(kwargs["volume_type"])
if "volume_disk_type_tag" in kwargs:
self.spmanage.input_volume_disk_type_tag(kwargs["volume_disk_type_tag"])
if "cloud_host_type" in kwargs:
self.spmanage.select_host_type(kwargs["cloud_host_type"])
if "test_period" in kwargs:
self.spmanage.select_test_period(kwargs["select_test_period"])
self.spmanage.click_complete_button()
except Exception as e:
self.log.error("创建产品规格失败:%s"%e)
def online_sp(self,spname):
try:
self.spmanage.open_specification_page()
sleep(globalparam.small)
self.spmanage.select_sp_name(spname)
self.spmanage.click_more_button()
sleep(globalparam.small)
self.spmanage.click_online_button()
self.spmanage.click_common_confirm_button_tag_a()
except Exception as e:
self.log.error("产品规格上线失败:%s"%e)
def offline_sp(self,spname):
try:
self.spmanage.open_specification_page()
sleep(globalparam.small)
self.spmanage.select_sp_name(spname)
self.spmanage.click_more_button()
sleep(globalparam.small)
self.spmanage.click_offline_button()
self.spmanage.click_common_confirm_button_tag_a()
except Exception as e:
self.log.error("产品规格下线失败:%s"%e)
def delete_sp(self,spname):
try:
self.spmanage.open_specification_page()
sleep(globalparam.small)
self.spmanage.select_sp_name(spname)
self.spmanage.click_more_button()
sleep(globalparam.small)
self.spmanage.click_delete_sp_button()
self.spmanage.click_common_confirm_button_tag_a()
except Exception as e:
self.log.error("产品规格上线失败:%s"%e)
def search_sp(self,spname):
try:
self.spmanage.open_specification_page()
sleep(globalparam.small)
self.spmanage.select_sp_name(spname)
sleep(globalparam.tiny)
data = self.spmanage.get_table_text()
return data
except Exception as e:
self.log.error("查询失败:%s,异常错误"%e)
if __name__ == '__main__':
from public.common import pyselenium
from config import globalparam
from public.appmodel.loginaction import Login
dr = pyselenium.PySelenium(globalparam.browser)
dr.max_window()
login = Login(dr).login("hubei01", "1qaz!QAZ")
#
sleep(3)
product =SpecificationAction(dr)
# # product.create_product("云主机","Openstack L","云主机","云主机测试","12","测试")
# product.product_offline("云主机测试")
# product.create_specification(productname="云主机",spname="云主机规格test",sptype=3,sptag="测试",spdes="自动化测试",vpool="湖北")
print(product.search_sp(spname="云主机规格test"))
sleep(2)
# product.create_product_class("123","1","234")
dr.quit()

View File

@ -48,11 +48,13 @@ if __name__ == '__main__':
dr = pyselenium.PySelenium(globalparam.browser)
dr.max_window()
login = Login(dr).login("系统管理员", "123456")
#
product = ProductAction(dr)
sleep(2)
product.create_productclassify("123","1","234")
# # user.create_user("河南","wuzs0001","wuzs0001","1qaz!QAZ","1qaz!QAZ","wzs@qq.com")
# user.create_tenant_user("wuzs_auto01", "wuzs_teant_0001", "wuzs_teant_0001", "1qaz!QAZ", "1qaz!QAZ", "wzs@qq.com")
# user.allocation_domain_administrator("河南","wuzs0001")
#
sleep(5)
dr.quit()

View File

@ -10,6 +10,7 @@ import allure
from time import sleep
from public.pages import auth_project_page
from public.common import log
from config import globalparam
class PojectAction(object):
@ -19,14 +20,14 @@ class PojectAction(object):
self.log = log.Log()
def create_project(self, tenantname, projectname, projectdesc):
sleep(globalparam.small)
with allure.step("创建项目"):
allure.attach("运营部门名称:%s" % tenantname)
allure.attach("项目名称:%s" % projectname)
allure.attach("项目描述:%s" % projectdesc)
self.propg.open_authproject()
self.dr.wait(10)
self.propg.click_new_create_buttun()
sleep(1)
sleep(globalparam.tiny)
self.propg.click_select_tenant()
self.propg.input_and_select_tenant(tenantname)
self.propg.click_select_zzjg()
@ -39,13 +40,12 @@ class PojectAction(object):
with allure.step("删除项目"):
allure.attach("项目名称:%s" % projectname)
self.propg.open_authproject()
self.dr.wait(10)
self.propg.input_and_search_project(projectname)
sleep(1)
sleep(globalparam.small)
self.propg.click_project_more_button()
sleep(0.5)
sleep(globalparam.tiny)
self.propg.click_project_delete_button()
sleep(0.5)
sleep(globalparam.tiny)
self.propg.click_project_delete_success_button()
def assign_admin_user_for_project(self,projectname,username):

View File

@ -10,6 +10,7 @@ import allure
from time import sleep
from public.pages import sys_regionMgrPage
from public.common import log
from config import globalparam
class Add_Res_Node(object):
@ -20,6 +21,7 @@ class Add_Res_Node(object):
self.log = log.Log()
def _skip_to_resource_node(self):
sleep(globalparam.middle)
self.regionpg.open_sys_regionMgr_page()
# self.log.info("跳转到资源节点页面")
# menupage = menuPage.MenuPage(self.dr)
@ -36,7 +38,6 @@ class Add_Res_Node(object):
virtual_type,
regDesc):
self._skip_to_resource_node()
self.dr.wait(10)
with allure.step("创建资源节点"):
allure.attach("域:%s" % regionname)
allure.attach("资源节点的名称:%s" % nodename)

View File

@ -12,6 +12,7 @@ from public.pages import menuPage
from public.pages import resSyncPage
from public.common import log
from public.common import publicfunction
from config import globalparam
class ResSync(object):
@ -32,10 +33,11 @@ class ResSync(object):
allure.attach("域:%s" % reginname)
allure.attach("资源节点的名称:%s" % datacenter)
self.log.info("同步物理资源")
sleep(globalparam.middle)
self.syncPage.open_ressyncpage()
self.syncPage.open_osphysicalsyncpage()
self.log.info("选择region%s;" % reginname)
sleep(1)
sleep(globalparam.small)
self.syncPage.click_select_region()
self.syncPage.select_region(reginname)
self.log.info("选择数据中心:%s" % datacenter)
@ -46,10 +48,10 @@ class ResSync(object):
allure.attach("数据中心名称:%s" % DC)
self.syncPage.select_and_click_data_center(DC)
self.syncPage.click_sync_buttun()
sleep(1)
sleep(globalparam.small)
# self.syncPage.switch_commit_page()
self.syncPage.click_commit_buttun()
sleep(1)
sleep(globalparam.small)
commit_button_flag = self.syncPage.is_exists_commit_buttun()
if commit_button_flag is True:
publicfunction.add_image(self.dr, "物理资源无法同步")

View File

@ -0,0 +1,136 @@
# -*- coding: utf-8 -*-
# @Time : 2020/2/24 10:11
# @Author : mrwuzs
# @Email : mrwuzs@outlook.com
# @File : volumeaction.py
# @Software: PyCharm
from time import sleep
from public.pages import controlcenterpage
from public.common import log
from public.appmodel import applyfromaction
class VolumeAction():
def __init__(self, driver):
self.dr = driver
self.mvp = controlcenterpage.ManageVolumePage(self.dr)
self.cs = controlcenterpage.ShoppingcarPage(self.dr)
self.log = log.Log()
def create_volume(
self,
projectname,
volumename,
vpool,
capacity,
mounttype,
**kwargs):
try:
self.mvp.open_pv_managevolume_page(projectname)
self.mvp.click_apply_volume_button()
self.mvp.click_vpool_box()
self.mvp.select_vpool(vpool)
print(capacity)
self.mvp.input_volume_capacity(capacity)
if mounttype == "独立磁盘":
self.mvp.click_independent_disk()
elif mounttype == "独享挂载":
self.mvp.click_cloud_host_category()
if kwargs["category"] == "已有云主机":
self.mvp.select_cloud_host_category("已有云主机")
elif kwargs["category"] == "申请单中云主机":
self.mvp.select_cloud_host_category("申请单中云主机")
else:
self.log.error("cant select loud_host_category")
if kwargs["cloudhost"]:
self.mvp.select_cloud_host(kwargs["cloudhost"])
else:
self.log.error("you must select a cloudhost")
elif mounttype == "共享挂载":
pass
else:
self.log.error(
"mounttype%s is not in ['独立磁盘','独享挂载','共享挂载']" %
mounttype)
self.mvp.input_volume_name(volumename)
if "volume_num" in kwargs:
host_count = kwargs["host_num"]
while host_count - 1:
host_count = host_count - 1
self.mvp.click_number_application_add()
sleep(2)
self.mvp.click_entry_form_button()
self.mvp.click_confirmation_form_button()
self.cs.page_to_bottom()
sleep(1)
self.cs.click_submission_apply_form()
sleep(1)
self.cs.page_to_bottom()
sleep(1)
self.cs.commit_submit_button()
except Exception as e:
self.log.error("创建云磁盘失败,请确认:%s" % e)
def attach_volume(self, projectname, volume, host, attachtype="exclusive"):
try:
self.mvp.open_pv_managevolume_page(projectname)
sleep(2)
self.mvp.select_volume(volume)
self.mvp.click_attach_button()
sleep(0.5)
self.mvp.click_attach_button()
print(attachtype)
if attachtype != "exclusive":
self.mvp.click_share_button()
self.mvp.click_host_for_attach_box()
self.mvp.select_host_for_attach(host)
sleep(0.5)
self.mvp.click_commit_for_attach_buttton()
except Exception as e:
self.log.error("挂载磁盘失败:%s" % e)
def delete_volume(self, projectname, volume):
try:
self.mvp.open_pv_managevolume_page(projectname)
sleep(1)
self.mvp.select_volume(volume)
self.mvp.click_volume_more_botton()
self.mvp.click_release_button()
self.mvp.click_release_commit_button()
except Exception as e:
self.log.error("删除磁盘失败:%s" % e)
def create_volume_snap(self, projectname, volume, snapname, des):
try:
self.mvp.open_pv_managevolume_page(projectname)
sleep(1)
self.mvp.select_volume(volume)
self.mvp.click_volume_more_botton()
self.mvp.click_create_snap_button()
sleep(0.5)
self.mvp.input_volume_sanp_name(snapname)
self.mvp.input_volume_snap_des(des)
self.mvp.click_create_button_yellow()
except Exception as e:
self.log.error("创建磁盘快照失败:%s" % e)
if __name__ == '__main__':
from public.common import pyselenium
from config import globalparam
from public.appmodel.loginaction import Login
dr = pyselenium.PySelenium(globalparam.browser)
dr.wait(10)
dr.max_window()
login = Login(dr).login("hubei01", "1qaz!QAZ")
sleep(2)
vc = VolumeAction(dr)
# vc.create_volume("湖北","测试磁盘01","湖北","100",mounttype="共享挂载",category="已有云主机",cloudhost="测试111")
vc.create_volume_snap("湖北", "测试磁盘01", "快照测试", "描述信息")
sleep(10)
dr.quit()

150
public/common/mysql_pub.py Normal file
View File

@ -0,0 +1,150 @@
# -*- coding: utf-8 -*-
# @Time : 2020/2/20 12:19
# @Author : mrwuzs
# @Email : mrwuzs@outlook.com
# @File : mysql_pub.py
# @Software: PyCharm
'''
定义对mysql数据库基本操作的封装
1.单条数据的操作insertupdatedelete
2.查询数据表的一条数据
3.查询数据表的所有数据
'''
import pymysql
from public.common.log import Log
class OpMysql():
'''mysql操作类基于pymysql的封装'''
log = Log()
def __init__(self,host,port,username,password,databasename):
'''
初始化opmysql对象
:param host:数据库服务器地址
:param username:数据库用户名
:param password:用户的密码
:param databasename:要操作的库名称
'''
try:
self.conn = pymysql.connect(
host = host,
user = username,
password = password,
database = databasename,
port = port,
charset = 'utf8', # 如果sql语句中存在中文字符的时候需要在这里指定charset的参数否则中文显示乱码
cursorclass = pymysql.cursors.DictCursor # pymysql默认select获取的数据是元祖类型如果想要字典类型的数据可以在这里统一设置
)
self.cur = self.conn.cursor() #创建游标
self.log.info('数据库连接成功')
except pymysql.Error as e:
self.log.info("[connection_message]-host:%s;user:%s;password:%s;database:%s"%(host,username,password,databasename))
self.log.error("数据库连接错误%s"%e)
def op_sql(self,query,params=None):
'''
单条数据的操作insertupdatedelete
:param query:包含%s的sql字符串当params=None的时候不包含%s
:param params:一个元祖默认为None
:return:如果执行过程没有crash返回True反之返回False
'''
try:
self.cur.execute(query,params)
self.conn.commit()
return True
except BaseException as e:
self.conn.rollback() #如果这里是执行的执行存储过程的sql命令那么可能会存在rollback的情况所以这里应该考虑到
self.log.info("[sql_str_message]-%s"%self.cur.mogrify(query,params))
self.log.error(e)
return False
def select_one(self,query,params=None):
'''
查询数据表的单条数据
:param query: 包含%s的sql字符串当params=None的时候不包含%s
:param params: 一个元祖默认为None
:return: 如果执行未crash并以包含dict的列表的方式返回select的结果否则返回错误代码001
'''
try:
self.cur.execute(query,params)
self.cur.scroll(0,"absolute") #光标回到初始位置,感觉自己的这句有点多余
return self.cur.fetchone()
except BaseException as e:
self.log.info("[sql_str_message]-%s" % self.cur.mogrify(query, params))
self.log.error(e)
return "001" #错误代码001
def select_all(self,query,params=None):
'''
查询数据表的单条数据
:param query:包含%s的sql字符串当params=None的时候不包含%s
:param params:一个元祖默认为None
:return:如果执行未crash并以包含dict的列表的方式返回select的结果否则返回错误代码001
'''
try:
self.cur.execute(query,params)
self.cur.scroll(0,"absolute") #光标回到初始位置,感觉这里得这句有点多余
return self.cur.fetchall()
except BaseException as e:
self.log.info("[sql_str_message]-%s" % self.cur.mogrify(query, params))
self.log.error(e)
return "001" #错误代码001
def insert_many(self,query,params):
'''
向数据表中插入多条数据
:param query:包含%s的sql字符串当params=None的时候不包含%s
:param params:一个内容为元祖的列表
:return:如果执行过程没有crash返回True反之返回False
'''
try:
self.cur.executemany(query,params)
self.conn.commit()
return True
except BaseException as e:
self.conn.rollback()
self.log.info("[sql_str_message]-%s" % self.cur.mogrify(query, params))
self.log.error(e)
return False
def delete_all(self,query):
try:
self.cur.execute(query)
self.conn.commit()
self.log.info("%s——--》清空表成功" %query)
return True
except BaseException as e:
self.conn.rollback()
self.log.info("[sql_str_message]-%s" % self.cur.mogrify(query))
self.log.error(e)
return False
def dis_db(self):
self.cur.close()
self.conn.close()
self.log.info("断开数据库")
#
# def __del__(self):
# '''
# 当该对象的引用计数为0的时候python解释器会自动执行__dell__方法自动释放游标和链接
# '''
# # self.cur.close()
# self.conn.close()
# print("数据库连接关闭")
if __name__ == "__main__":
# test
user = OpMysql('192.168.253.55',14316,'arkproxy','P@ssw0rd','user')
uuid = user.select_one("SELECT UUID FROM project WHERE NAME LIKE '%湖北%' ")
print(uuid["UUID"])
#rack.op_sql("UPDATE region_group SET hub_vregion_id= '413c625c-323b-4f2c-8910-fdfb44de2219' WHERE name = %s;",("hub_vregion1",))

View File

@ -9,6 +9,7 @@ import os
import time
import allure
from config import globalparam
from public.common.mysql_pub import OpMysql
# 截图放到report下的img目录下
@ -37,10 +38,16 @@ def is_Chinese(char):
else:
return False
def get_project_id(projectname):
user = OpMysql('192.168.253.55',14316,'arkproxy','P@ssw0rd','user')
uuid = user.select_one("SELECT UUID FROM project WHERE NAME LIKE '%s' "%projectname)["UUID"]
return uuid
if __name__ == '__main__':
from public.common import pyselenium
dr = pyselenium.PySelenium(globalparam.browser)
dr.max_window()
dr.open('http://192.168.54.13/#/login')
get_img(dr, "登录界面")
# dr = pyselenium.PySelenium(globalparam.browser)
# dr.max_window()
# dr.open('http://192.168.54.13/#/login')
# get_img(dr, "登录界面")
print(get_project_id("湖北"))

View File

@ -151,7 +151,7 @@ class PySelenium(object):
elif by == "css":
WebDriverWait(
self.driver, secs, 1).until(
EC.presence_of_element_located(move_to_element
EC.presence_of_element_located(
(By.CSS_SELECTOR, value)), messages)
else:
raise NameError(
@ -474,6 +474,18 @@ class PySelenium(object):
"{0} send the key esc, Spend {1} seconds".format(
success, time.time() - t1))
def END(self):
"""
send END key
:return:
"""
t1 = time.time()
ActionChains(self.driver).send_keys(Keys.END).perform()
self.my_print(
"{0} send the key END, Spend {1} seconds".format(
success, time.time() - t1))
def backspace(self,css):
"""
send esc key
@ -754,7 +766,7 @@ class PySelenium(object):
all_handle = self.driver.window_handles
flag = 0
while len(all_handle) < 2:
time.sleep(1)
time.sleep(globalparam.small)
all_handle = self.driver.window_handles
flag += 1
if flag == 5:

View File

@ -20,7 +20,7 @@ class AuthProductPage(basepage.Page):
"/csdp/manage/#/manage-view/adminManage/folder/prodCateg")
def click_crate_product_classify_button(self):
self.log.debug("击创建产品分类按钮")
self.log.debug("击创建产品分类按钮")
self.dr.click("xpath->(//button[@type='button'])[10]")
def input_clssifyname(self, value):
@ -32,7 +32,7 @@ class AuthProductPage(basepage.Page):
self.dr.clear_type("xpath->/html/body/app-component/div[1]/main-component/div/div/manage-component/div/div/div/div/div[1]/div[1]/div[2]/form/div[1]/div/div[3]/div/input", value)
def click_select_classify_button(self):
self.log.debug("击选择产品分类图标按钮")
self.log.debug("击选择产品分类图标按钮")
self.dr.click("xpath->/html/body/app-component/div[1]/main-component/div/div/manage-component/div/div/div/div/div[1]/div[1]/div[2]/form/div[1]/div/div[4]/div/div/span/button")
def click_select_classify_menu_button(self, value):
@ -40,7 +40,7 @@ class AuthProductPage(basepage.Page):
self.dr.click("xpath->/html/body/div[4]/div/div[2]/div/ul/li[2]/i")
def click_assure_button(self):
self.log.debug("击确定按钮")
self.log.debug("击确定按钮")
self.dr.click("xpath->/html/body/div[4]/div/div[3]/div/button[1]")
def input_description(self, value):
@ -49,5 +49,5 @@ class AuthProductPage(basepage.Page):
"/html/body/app-component/div[1]/main-component/div/div/manage-component/div/div/div/div/div[1]/div[1]/div[2]/form/div[1]/div/div[5]/div/textarea",value)
def click_new_product_classify_save_button(self):
self.log.debug("击保存按钮")
self.log.debug("击保存按钮")
self.dr.click("xpath->/html/body/app-component/div[1]/main-component/div/div/manage-component/div/div/div/div/div[1]/div[1]/div[2]/form/div[2]/div/div/button[1]")

View File

@ -19,11 +19,11 @@ class AuthUsertPage(basepage.Page):
"/csdp/manage/#/manage-view/adminManage/auth/user")
def click_crate_user_button(self):
self.log.debug("击创建用户按钮")
self.log.debug("击创建用户按钮")
self.dr.click("xpath->(//button[@type='button'])[10]")
def click_selcet_tenant(self):
self.log.debug("击选择运营部门按钮")
self.log.debug("击选择运营部门按钮")
self.dr.click("xpath->//span/button/i")
def input_select_tenant(self, value):
@ -36,13 +36,13 @@ class AuthUsertPage(basepage.Page):
# ,value)
def click_radio_tenant_name(self):
self.log.debug("击运营部门单选框")
self.log.debug("击运营部门单选框")
self.dr.click(
"xpath->//div[@id='selectClientModal']/div[@class='modal-body']/div[@class='box-body form']/"
"table-component/div/table/tbody/tr/td[1]/div/span/input[@type='radio']")
def click_commit_button(self):
self.log.debug("击确定按钮")
self.log.debug("击确定按钮")
self.dr.click(
"xpath->//div[@id='selectClientModal']/div[@class='modal-footer']/"
"button[@class='btn btn-flat btn-primary']")
@ -68,7 +68,7 @@ class AuthUsertPage(basepage.Page):
self.dr.clear_type("xpath->(//input[@name='email'])[2]", value)
def click_new_user_save_button(self):
self.log.debug("击保存按钮")
self.log.debug("击保存按钮")
self.dr.click("xpath->//form/div[2]/div/div/button")
def input_select_user(self, value):
@ -77,13 +77,13 @@ class AuthUsertPage(basepage.Page):
"xpath->//div[@class='table-toolbar']/div/div//form/div/div/input", value)
def click_user_more_button(self):
self.log.debug("击更多按钮")
self.log.debug("击更多按钮")
self.dr.click("xpath->//span[contains(.,'更多')]")
def click_user_delete_button(self):
self.log.debug("击删除按钮")
self.log.debug("击删除按钮")
self.dr.click("xpath->//button[contains(.,'删除')]")
def click_user_delete_success_button(self):
self.log.debug("击确定按钮")
self.log.debug("击确定按钮")
self.dr.click("xpath->//a[contains(.,'确定')]")

View File

@ -18,11 +18,11 @@ class AuthProjectPage(basepage.Page):
"/csdp/manage/#/manage-view/adminManage/auth/projects")
def click_new_create_buttun(self):
self.log.debug("击创建项目按钮")
self.log.debug("击创建项目按钮")
self.dr.click("xpath->//div[5]/button/i")
def click_select_tenant(self):
self.log.debug("击选择运营部门")
self.log.debug("击选择运营部门")
self.dr.click("xpath->//span[contains(.,'请选择运营部门')]")
def input_and_select_tenant(self, value):
@ -30,7 +30,7 @@ class AuthProjectPage(basepage.Page):
self.dr.type_and_enter("xpath->(//input[@type='search'])[3]", value)
def click_select_zzjg(self):
self.log.debug("击选择组织机构按钮")
self.log.debug("击选择组织机构按钮")
self.dr.click("xpath->//div[3]/div/div/button[2]/i")
def input_project_name(self, value):
@ -46,7 +46,7 @@ class AuthProjectPage(basepage.Page):
self.dr.click("xpath->//a[contains(text(),'%s')]" % value)
def click_save_new_project(self):
self.log.debug("击保存项目按钮")
self.log.debug("击保存项目按钮")
self.dr.click("xpath->(//button[@type='button'])[10]")
def input_and_search_project(self, value):
@ -55,19 +55,19 @@ class AuthProjectPage(basepage.Page):
"xpath->//div/div/div/div/div/div/div/div/form/div/div/input", value)
def click_project_more_button(self):
self.log.debug("击更多按钮")
self.log.debug("击更多按钮")
self.dr.click("xpath->//span[contains(.,'更多')]")
def click_project_delete_button(self):
self.log.debug("击删除按钮")
self.log.debug("击删除按钮")
self.dr.click("xpath->//button[contains(.,'删除')]")
def click_project_delete_success_button(self):
self.log.debug("击确定按钮")
self.log.debug("击确定按钮")
self.dr.click("xpath->//a[contains(.,'确定')]")
def click_project_network_button(self):
self.log.debug("击网络按钮")
self.log.debug("击网络按钮")
self.dr.click("xpath->//button[contains(.,'网络')]")
def click_project_name_button(self,value):
@ -92,7 +92,7 @@ class AuthProjectPage(basepage.Page):
self.dr.click("xpath->//a[contains(text(),'管理用户')]")
def input_serach_user_box(self,value):
"""击选择用户后的页面"""
"""击选择用户后的页面"""
self.log.debug("查询用户:%s"%value)
self.dr.type_and_enter("xpath->(//input[@type='search'])[7]",value)
@ -109,5 +109,5 @@ class AuthProjectPage(basepage.Page):
def click_remove_button(self):
"""操作下的移除按钮"""
self.log.debug("击移除按钮")
self.log.debug("击移除按钮")
self.dr.click("")

View File

@ -18,7 +18,7 @@ class AuthTenantPage(basepage.Page):
"/csdp/manage/#/manage-view/adminManage/auth/tenant")
def click_create_tenant_button(self):
self.log.debug("击新建运营部门按钮")
self.log.debug("击新建运营部门按钮")
self.dr.click("xpath->//button[contains(.,'新建运营部门')]")
def input_tenant_name(self, value):
@ -34,7 +34,7 @@ class AuthTenantPage(basepage.Page):
self.dr.clear_type("name->phoneNo", value)
def click_save_button(self):
self.log.debug("击保存按钮")
self.log.debug("击保存按钮")
self.dr.click("xpath->//button[@type='submit']")
def input_secrch_tenant(self, value):
@ -43,33 +43,33 @@ class AuthTenantPage(basepage.Page):
"xpath->//div[@class='col-md-3 padding-0']/form/div/div/input", value)
def click_pull_down_button(self):
self.log.debug("击下拉按钮")
self.log.debug("击下拉按钮")
self.dr.click("xpath->//div[@id='card']/div/div[2]/div/a[2]/i")
def click_tenant_delete_button(self):
self.log.debug("击删除按钮")
self.log.debug("击删除按钮")
self.dr.click("xpath->//a[contains(text(),'删除')]")
def click_tenant_delete_success_button(self):
self.log.debug("击确定按钮")
self.log.debug("击确定按钮")
self.dr.click("xpath->//a[contains(.,'确定')]")
def click_tenant_view_details_button(self):
self.log.debug("击查看详细按钮")
self.log.debug("击查看详细按钮")
self.dr.click("xpath->//a[contains(.,'查看详细')]")
def click_post_button(self):
self.log.debug("击岗位按钮")
self.log.debug("击岗位按钮")
self.dr.click("xpath->//a[contains(text(),'岗位')]")
def click_user_num_button(self):
self.log.debug("击用户数量按钮")
self.log.debug("击用户数量按钮")
self.dr.click("xpath->//td[3]/div/a")
def click_remove_user_button(self):
self.log.debug("击移除按钮")
self.log.debug("击移除按钮")
self.dr.click("xpath->//button[contains(.,'移除')]")
def click_remove_user_success_button(self):
self.log.debug("击确定按钮")
self.log.debug("击确定按钮")
self.dr.click("xpath->//a[contains(.,'确定')]")

View File

@ -7,6 +7,7 @@
from public.common import log
from config import globalparam
from public.common import publicfunction
class Page(object):
"""
@ -20,7 +21,7 @@ class Page(object):
def click_res_node_mag(self):
self.log.debug("击资源节点管理")
self.log.debug("击资源节点管理")
self.dr.click("xpath -> //li[contains(.,'资源节点管理')]")
def open_resource_overview(self):
@ -38,7 +39,7 @@ class Page(object):
self.dr.move_to_element("xpath->//div[@id='app']/section/header/div/div/div[3]/div[3]/span/i")
def click_logout_button(self):
self.log.debug("击退出按钮")
self.log.debug("击退出按钮")
self.dr.click("xpath->//ul/li[text()='退出']")
def click_common_confirm_button(self):
@ -64,7 +65,7 @@ class Page(object):
def click_project_view_button(self):
self.log.debug("击项目视图按钮")
self.log.debug("击项目视图按钮")
self.dr.click("xpath->//li[contains(.,'项目视图')]")
def move_to_project_cloud_host_button(self):
@ -74,11 +75,36 @@ class Page(object):
def click_control_center_button(self):
page = self.dr.origin_driver.page_source
print(page)
self.log.debug("击控制中心-云主机按钮")
self.log.debug("击控制中心-云主机按钮")
self.dr.click("xpath->//span[text()='云主机快照']")
# self.dr.js("arguments[0].click();", el)
`
def click_cloud_host_snap_button(self):
self.log.debug("击云主机快照")
self.log.debug("击云主机快照")
self.dr.click("xpath->//span[contains(.,'云主机快照')]")
def click_control_view(self):
self.log.debug("鼠标单击概览按钮")
self.dr.get_("xpath->//body/app-component")
#项目视图
def open_pv_cloudhost(self,projectname):
self.log.debug("打开项目视图的控制中心云主机页面")
prject_id = publicfunction.get_project_id(projectname)
self.dr.open(globalparam.url+"/csdp/project/#/project/%s/control/manage_vm"%prject_id)
def open_pv_managevolume_page(self,projectname):
self.log.debug("打开项目视图的控制中心云磁盘页面")
prject_id = publicfunction.get_project_id(projectname)
self.dr.open(globalparam.url+"/csdp/project/#/project/%s/control/manage_volume"%prject_id)
def open_shoppingcar_page(self,projectname):
self.log.debug("打开申请单页面")
prject_id = publicfunction.get_project_id(projectname)
self.dr.open(globalparam.url+"/csdp/project/#/project/%s/shoppingcar"%prject_id)
def page_to_bottom(self):
self.log.debug("下滑页面到底部")
self.dr.END()

View File

@ -10,9 +10,191 @@ import allure
from public.pages import basepage
from config import globalparam
class CloudHostPage(basepage.Page):
def click_123(self):
print("1234")
class ControlCenterPage(basepage.Page):
def click_entry_form_button(self):
self.log.debug("单击加入申请单按钮")
self.dr.click("xpath->//button[contains(.,'加入申请单')]")
def click_confirmation_form_button(self):
self.log.debug("单击取人申请单按钮")
self.dr.click("xpath->//button[contains(.,'确认申请单')]")
class CloudHostPage(ControlCenterPage):
def click_apply_cloudhost_button(self):
self.log.debug("单击申请云主机按钮")
self.dr.click("xpath->//button[contains(.,' 申请云主机')]")
def click_box_vpool(self):
self.log.debug("单击可用区下拉框")
self.dr.click("xpath->//form[@id='serviceForm']/div/form-group-attr-component/div/div/div/div/span/span[2]/span")
def input_and_search_box_vpool(self,value):
self.log.debug("输入要选择的可用区")
self.dr.type_and_enter("xpath->(//input[@type='search'])[3]",value)
def click_ipv6_button(self):
self.log.debug("单击IPV6按钮")
self.dr.click("xpath->//button[contains(.,'6')]")
def click_ipv4_button(self):
self.log.debug("单击IPV4按钮")
self.dr.click("xpath->//button[contains(.,'4')]")
def click_subnet_box(self):
self.log.debug("单击子网选择框")
self.dr.click("xpath->//form-group-select-component/div/div/div/div/span/span[2]/span")
def input_and_select_subnet(self,value):
self.log.debug("输入要选择的子网,并按回车确定")
self.dr.type_and_enter("xpath->(//input[@type='search'])[4]",value)
def click_ip_box(self):
self.log.debug("单击IP地址选择框")
self.dr.click("xpath->//div[2]/div/div/div/input")
def input_and_select_ip(self,value):
self.log.debug("输入要选择的IP地址并按回车确定")
self.dr.type_and_enter("xpath->//div[2]/div/div/div/input",value)
#目前只模板部署,后续添加
def input_cpu(self,value):
self.log.debug("输入CPU核数")
self.dr.clear_type("xpath->//csdp-ui-slider/input",value)
def input_mem(self,value):
self.log.debug("输入内存单位G")
self.dr.clear_type("xpath->//form-group-attr-component[3]/div/div/csdp-ui-slider/input",value)
def input_boot_disk(self,value):
self.log.debug("输入系统盘大小单位G")
self.dr.clear_type("xpath->//form-group-attr-component[4]/div/div/csdp-ui-slider/input",value)
def select_data_disk_button(self):
self.log.debug("单击选择数据盘按钮")
self.dr.click("xpath->//div[4]/div/div/button")
def input_data_disk_size(self,value):
self.log.debug("输入数据盘大小")
self.dr.clear_type("xpath->//div/div/div/csdp-ui-slider/input",value)
def input_cloud_host_name(self,value):
self.log.debug("输入云主机名称")
self.dr.clear_type("xpath->//input[@name='']",value)
def click_add_host_num(self):
self.log.debug("单击申请数量‘+")
self.dr.click("xpath->//form[@id='serviceForm']/div/form-group-number-component/div/div/div/a[2]/i")
class ShoppingcarPage(ControlCenterPage):
"""上项目视图申请单页面"""
def click_submission_apply_form(self):
self.log.debug("单击提交申请单")
self.dr.click("xpath->//button[contains(.,'提交申请单')]")
def commit_submit_button(self):
self.log.debug("单击确认提交按钮")
self.dr.click("xpath->//button[contains(.,'确认提交')]")
class ManageVolumePage(ControlCenterPage):
def click_apply_volume_button(self):
self.log.debug("单击申请云磁盘按钮")
self.dr.click("xpath->//button[contains(.,' 申请云磁盘')]")
def click_vpool_box(self):
self.log.debug("单击可用去按钮")
self.dr.click("xpath->//form[@id='serviceForm']/div/form-group-attr-component/div/div/div/div/span/span[2]/span")
def select_vpool(self,value):
self.log.debug("选择可用去")
self.dr.type_and_enter("xpath->//form-group-attr-component/div/div/div/input",value)
def input_volume_capacity(self,value):
self.log.debug("输入云磁盘的容量")
self.dr.clear_type("xpath->//csdp-ui-slider/input",value)
def click_independent_disk(self):
self.log.debug("单击独立磁盘按钮")
self.dr.click("xpath->//form-group-attr-component[3]/div/div/input")
def input_volume_name(self,value):
self.log.debug("输入云磁盘名称")
self.dr.clear_type("xpath->//form-group-attr-component[3]/div/div/input",value)
def click_number_application_add(self):
self.log.debug("单击申请数量加按钮")
self.dr.click("xpath->//form[@id='serviceForm']/div/form-group-number-component/div/div/div/a[2]")
def click_cloud_host_category(self):
self.log.debug("单击云主机类别")
self.dr.click("xpath->//form-group-select-component/div/div/div/div/span/span[2]/span")
def select_cloud_host_category(self,value):
self.log.debug("选择云主机类别")
self.dr.type_and_enter("xpath->//form-group-select-component/div/div/div/input",value)
def select_cloud_host(self,value):
self.log.debug("选择云主机")
self.dr.click("xpath->//span[contains(.,'%s')]"%value)
def select_volume(self,valume):
self.log.debug("选择磁盘:%s"%valume)
self.dr.type_and_enter("xpath->(//input[@type='text'])[10]",valume)
def click_attach_button(self):
self.log.debug("单击挂载按钮")
self.dr.click("xpath->//td[8]/span/button")
def click_exclusive_button(self):
self.log.debug("单击独享按钮")
self.dr.click("xpath->(///input[@type='checkbox'])[4]")
def click_share_button(self):
self.log.debug("单击共享按钮")
self.dr.click("xpath=(//input[@type='checkbox'])[5]")
def click_host_for_attach_box(self):
self.log.debug("单击云主机选择框")
self.dr.click("xpath->//div[4]/div/div/div/div/div/span/span[2]/span")
def select_host_for_attach(self,value):
self.log.debug("选择要挂载的虚拟机")
self.dr.type_and_enter("xpath->(//input[@type='search'])[6]",value)
def click_commit_for_attach_buttton(self):
self.log.debug("单击确定按钮")
self.dr.click("xpath->//div[@id='attachVolumeModal']/div[3]/button")
def click_volume_more_botton(self):
self.log.debug("单击更多按钮")
#这个按钮需要先把鼠标移动上去
self.dr.move_to_element("xpath->//div/a/span")
self.dr.click("xpath->//div/a/span")
def click_release_button(self):
self.log.debug("单击释放按钮")
self.dr.click("xpath->//div/ul/li[2]/button")
def click_release_commit_button(self):
self.log.debug("单击确定按钮")
self.dr.click("xpath->//a[contains(.,'确定')]")
#创建快照
def click_create_snap_button(self):
self.log.debug("单击创建磁盘快照按钮")
self.dr.click("xpath->//button[contains(.,'创建快照')]")
def input_volume_sanp_name(self,value):
self.log.debug("输入磁盘快照名称")
self.dr.clear_type("xpath->//input[@name='snapshotName']",value)
def input_volume_snap_des(self,value):
self.log.debug("输入磁盘快照的描述信息")
self.dr.clear_type("xpath->(//textarea[@type='text'])[2]",value)
def click_create_button_yellow(self):
self.log.debug("点击创建按钮")
self.dr.click("xpath->//div[@id='createVolumesnapshotModal']/form/div[2]/button")

View File

@ -100,11 +100,11 @@ class DataCenterPage(basepage.Page):
#保存
def click_save_phy_net_button(self):
self.log.debug("击保存按钮")
self.log.debug("击保存按钮")
self.dr.click("xpath->(//button[@type='submit'])[2]")
#取消
def click_cancel_phy_net_button(self):
self.log.debug("击确定取消")
self.log.debug("击确定取消")
self.dr.click("xpath->//div[@id='net_modal']/form/div[3]/button[2]")

View File

@ -10,88 +10,327 @@ from public.pages import basepage
from config import globalparam
class FolderPgae(basepage.Page):
pass
class ProdCateg(FolderPgae):
class ProdCategPage(FolderPgae):
"""产品分类"""
@allure.step("服务目录-产品分类页面")
def open_prod_catg_page(self):
self.log.debug("打开服务目录-产品分类页面")
self.dr.open(globalparam.url + "/csdp/manage/#/manage-view/adminManage/folder/prodCateg")
self.dr.open(
globalparam.url +
"/csdp/manage/#/manage-view/adminManage/folder/prodCateg")
@allure.step("点击新建按钮")
def click_new_create_button(self):
self.log.debug("击新建按钮")
self.dr.click("xpath=//button[contains(.,'新建')]")
@allure.step("击新建按钮")
def click_new_create_prod_button(self):
self.log.debug("击新建按钮")
self.dr.click("xpath->//button[contains(.,'新建')]")
#新建产品分类
# 新建产品分类
@allure.step("")
def input_systematic_name(self,value):
def input_systematic_name(self, value):
self.log.debug("输入分类名称")
self.dr.type_and_enter("xpath=//input[@name='name']",value)
self.dr.type_and_enter("xpath->//input[@name='name']", value)
def input_systematic_number(self,value):
def input_systematic_number(self, value):
self.log.debug("输入分类序号")
self.dr.type_and_enter("xpath=//input[@name='id']",value)
self.dr.type_and_enter("xpath->//input[@name='id']", value)
def click_produc_category_icon(self):
self.log.debug("击产品分类图标")
self.dr.click("xpath=//button[contains(.,'选择产品分类图标')]")
self.log.debug("击产品分类图标")
self.dr.click("xpath->//button[contains(.,'选择产品分类图标')]")
def click_cloud_host(self):
self.log.debug("点击云主机图标")
self.dr.click("xpath=//li[contains(.,'云主机')]")
def click_cloud_host_icon(self):
self.log.debug("单击云主机图标")
# self.dr.click("xpath->//div/ul/li[contains(.,'云主机')]")
self.dr.click("xpath->//div[2]/div/ul/li[2]/i")
def click_cloud_disk(self):
self.log.debug("击云磁盘图标")
self.dr.click("xpath=//li[contains(.,'云磁盘')]")
def click_cloud_disk_icon(self):
self.log.debug("击云磁盘图标")
self.dr.click("xpath->//li[contains(.,'云磁盘')]")
def click_bare_metal_server_icon(self):
self.log.debug("点击裸金属服务器图标")
self.dr.click("")
self.log.debug("单击裸金属服务器图标")
self.dr.click("xpath->//div[2]/div/ul/li/i")
def click_phy_res_icon(self):
self.log.debug("单击物理资源图标")
self.dr.click(
"xpath->//div[@id='selectprodcateModal']/div[2]/div/ul/li[4]/i")
def click_loadbalance_icon(self):
self.log.debug("单击负载均衡器图标")
self.dr.click(
"xpath->//div[@id='selectprodcateModal']/div[2]/div/ul/li[5]/i")
def click_public_ip_icon(self):
self.log.debug("单击公网IP图标")
self.dr.click(
"xpath->//div[@id='selectprodcateModal']/div[2]/div/ul/li[6]/i")
def click_cloud_host_backup_icon(self):
self.log.debug("单击云主机备份图标")
self.dr.click(
"xpath->//div[@id='selectprodcateModal']/div[2]/div/ul/li[7]/i")
def click_container_service_icon(self):
self.log.debug("单击容器服务图标")
self.dr.click(
"xpath->//div[@id='selectprodcateModal']/div[2]/div/ul/li[8]/i")
def click_bandwidth_icon(self):
self.log.debug("d单击外网带宽图标")
self.dr.click(
"xpath->//div[@id='selectprodcateModal']/div[2]/div/ul/li[9]/i")
def click_commit_button(self):
self.log.debug("点击确认按钮")
self.dr.click("xpath->//a[contains(.,'确定')]")
self.log.debug("单击确认按钮")
self.dr.click(
"xpath->//div[@id='selectprodcateModal']/div[3]/div/button")
def click_cancel_button(self):
self.log.debug("点击取消按钮")
self.log.debug("击取消按钮")
self.dr.click("xpath->//a[contains(.,'取消')]")
def input_describ(self,value):
def input_describ(self, value):
self.log.debug("输入描述")
self.dr.type_and_enter("xpath=//div[5]/div/textarea",value)
self.dr.type_and_enter("xpath->//div[5]/div/textarea", value)
def click_submit_button(self):
self.log.debug("点击保存按钮")
self.dr.click("xpath=//button[@type='submit']")
self.log.debug("击保存按钮")
self.dr.click("xpath->//button[@type='submit']")
def click_create_page_cancel_button(self):
self.log.debug("点击取消按钮")
self.log.debug("击取消按钮")
self.dr.click("xpath->//a[contains(.,'取消')]")
def select_product_class(self, value):
self.log.debug("查找产品分类")
self.dr.type_and_enter("xpath->(//input[@type='text'])[12]", value)
def get_table_text(self):
self.log.debug("获取表格下的数据")
text = self.dr.get_text(
"xpath->//manage-component/div/div/div/div/div/div/div/table-component/div")
return text
class ProductManagePage(FolderPgae):
@allure.step("打开产品管理页面")
def open_product_manage_page(self):
pass
self.log.debug("打开产品管理页面")
self.dr.open(
globalparam.url +
"/csdp/manage/#/manage-view/adminManage/folder/productManage")
#操作系统管理
class OperationSystemPage(FolderPgae):
def click_create_product_button(self):
self.log.debug("单击新建产品按钮")
self.dr.click("xpath->//div[3]/button")
def click_product_class_box(self):
self.log.debug("单击产品分类框")
self.dr.click("xpath->//div[2]/div/div/div/span/span[2]/span")
def select_product_class_name(self, value):
self.log.debug("输入:%s并且按enter" % value)
self.dr.type_and_enter("xpath->(//input[@type='search'])[3]", value)
def click_platform_box(self):
self.log.debug("单击平台选择框")
self.dr.click("xpath->(//input[@type='search'])[4]")
def select_platform(self, value):
self.log.debug("输入:%s并按enter" % value)
self.dr.type_and_enter("xpath->(//input[@type='search'])[4]", value)
def click_resource_type_box(self):
self.log.debug("单击资源类型框")
self.dr.click("xpath->//div[4]/div/div/div/span")
def select_resource_type(self, value):
self.log.debug("选择资源类型")
self.dr.type_and_enter("xpath->(//input[@type='search'])[5]", value)
def input_product_name(self, value):
self.log.debug("输入产品名称")
self.dr.clear_type("xpath->//input[@name='name']", value)\
def input_product_num(self, value):
self.log.debug("输入产品序号")
self.dr.clear_type("xpath->//input[@name='id']", value)
def click_get_url_button(self):
self.log.debug("单击获取url按钮")
self.dr.click("xpath->//button[contains(.,'获取URL')]")
def click_cloud_res_openup_button(self):
self.log.debug("勾选云资源沟通")
# self.dr.click("xpath->//span[contains(.,'云主机资源开通')]")
self.dr.click("xpath->//div[2]/div/form/div/div/div/div/label")
def click_cloud_dick_openup_button(self):
self.log.debug("单击云磁盘开通")
self.dr.click("xpath->//div[@id='uniform-optionsRadios22']/span")
def click_commit_button(self):
self.log.debug("单击确定按钮")
self.dr.click(
"xpath->//div[@id='load_formUrl_Modal']/div[2]/div[2]/button")
def input_product_des(self, value):
self.log.debug("输入产品描述")
self.dr.clear_type("xpath->//div[8]/div/textarea", value)
def click_save_button(self):
self.log.debug("单击保存按钮")
self.dr.click("xpath->//form/div[2]/div/div/button")
def select_product(self, value):
self.log.debug("查询产品")
self.dr.type_and_enter("xpath->(//input[@type='text'])[12]", value)
def click_more_button(self):
self.log.debug("单击更多按钮")
self.dr.move_to_element("xpath->//span[contains(.,'更多')]")
self.dr.click("xpath->//span[contains(.,'更多')]")
def click_online_button(self):
self.log.debug("单击上线按钮")
self.dr.click("xpath->//button[contains(.,'上线')]")
def click_offline_button(self):
self.log.debug("单击下线按钮")
self.dr.click("xpath->//button[contains(.,'下线')]")
def get_table_text(self):
self.log.debug("获取产品表格下的数据")
text = self.dr.get_text(
"xpath->//manage-component/div/div/div/div/div/div/div/table-component/div")
return text
class SpecificationPage(FolderPgae):
def open_specification_page(self):
self.log.debug("打开产品规格")
self.dr.open(
globalparam.url +
"/csdp/manage/#/manage-view/adminManage/folder/specification")
def click_create_sp_button(self):
self.log.debug("单击新建按钮")
self.dr.click("xpath->//button[contains(.,'新建')]")
# 新建规格页面
def select_product_name(self, value):
self.log.debug("单击产品名称后的输入框")
self.dr.click("xpath->//div[2]/div/div/div/span/span[2]/span")
self.log.debug("选择产品名称")
self.dr.type_and_enter("xpath->(//input[@type='search'])[3]", value)
def input_spn_name(self, value):
self.log.debug("输入规格名称")
self.dr.clear_type("xpath->//input[@name='specName']", value)
def click_new_create_box(self):
self.log.debug("点击新建选择框")
self.dr.click("xpath->//label/div/span")
def click_change_box(self):
self.log.debug("点击变更选择框")
self.dr.click("xpath->//label[2]/div/span")
def input_sp_tag(self, value):
self.log.debug("输入标签")
self.dr.clear_type("xpath->(//input[@type='text'])[14]", value)
def input_sp_des(self, value):
self.log.debug("输入描述")
self.dr.clear_type("xpath->//div[6]/div/textarea", value)
def click_next_step_button(self):
self.log.debug("单击下一步按钮")
self.dr.click("xpath->//button[contains(.,'下一步')]")
# 配置属性
def select_vpool(self, value):
self.log.debug("单击vpool选择框")
self.dr.click("xpath->(//input[@type='search'])[3]")
self.log.debug("选择可用去")
self.dr.type_and_enter("xpath->(//input[@type='search'])[3]", value)
def input_volume_type(self, value):
self.log.debug("输入磁盘类型")
self.dr.clear_type("xpath->//input[@name='volume_disk_type']", value)
def input_volume_disk_type_tag(self, value):
self.log.debug("输入底层存储标签")
self.dr.clear_type(
"xpath->//input[@name='volume_disk_type_tag']", value)
def select_host_type(self, value):
self.log.debug("单击云主机类型选择框")
self.dr.click("xpath->(//input[@type='search'])[4]")
self.log.debug("选择云主机类型")
self.dr.type_and_enter("xpath->(//input[@type='search'])[4]", value)
def select_test_period(self, value):
if value not in range(1, 6):
self.log.error("测试期限必须在1-6个月之间请输入123456")
self.log.debug("单击测试期限选择框")
self.dr.click("xpath->(//input[@type='search'])[5]")
self.log.debug("选择测试期限")
self.dr.type_and_enter("xpath->(//input[@type='search'])[5]", value)
def click_complete_button(self):
self.log.debug("单击完成按钮")
self.dr.click("xpath->//button[contains(.,'完成')]")
def click_more_button(self):
self.log.debug("单击更多按钮")
self.dr.move_to_element("xpath->//span[contains(.,'更多')]")
self.dr.click("xpath->//span[contains(.,'更多')]")
def click_online_button(self):
self.log.debug("单击产品规格上线按钮")
self.dr.click("xpath->//button[contains(.,'上线')]")
def click_offline_button(self):
self.log.debug("单击产品规格下线按钮")
self.dr.click("xpath->//button[contains(.,'下线')]")
def click_delete_sp_button(self):
self.log.debug("单击删除按钮")
self.dr.click("xpath->//button[contains(.,'删除')]")
def select_sp_name(self, value):
self.log.debug("选择产品规格名称")
self.dr.type_and_enter("xpath->//div/div/div/div/div/div/div/div/form/div/div/input", value)
def get_table_text(self):
self.log.debug("获取表格下的数据")
text = self.dr.get_text(
"xpath->//manage-component/div/div/div/div/div/div/div/table-component/div")
return text
# 操作系统管理
class OperationSystemPage(FolderPgae):
@allure.step("打开:服务目录-操作系统管理")
def open_operation_sys_page(self):
self.log.debug("打开操作系统管理页面")
self.dr.open(globalparam.url+ "/csdp/manage/#/manage-view/adminManage/folder/operationsystem")
self.dr.open(
globalparam.url +
"/csdp/manage/#/manage-view/adminManage/folder/operationsystem")
@allure.step("点击新建按钮")
@allure.step("击新建按钮")
def click_new_create_button(self):
self.log.debug("点击新建按钮")
self.dr.click("xpath=//button[contains(.,'新建')]")
self.log.debug("击新建按钮")
self.dr.click("xpath->//button[contains(.,'新建')]")
#
# @allure.step("")
# @allure.step("")

View File

@ -34,8 +34,8 @@ class LoginPage(basepage.Page):
def click_loginbutton(self):
'''
击登录按钮
击登录按钮
:return:
'''''
self.log.debug("击登录按钮")
self.log.debug("击登录按钮")
self.dr.click("xpath -> //button[contains(.,'登录')]")

View File

@ -13,15 +13,15 @@ from config import globalparam
class NetwoekPage(basepage.Page):
def click_new_create_button(self):
self.log.debug("击新建网络按钮")
self.log.debug("击新建网络按钮")
self.dr.click("xpath->//button[contains(.,'新建')]")
def click_ipv4_button(self):
self.log.debug("击ipv4按钮")
self.log.debug("击ipv4按钮")
self.dr.click("xpath->//button[contains(.,'4')]")
def click_ipv6_button(self):
self.log.debug("击ipv6按钮")
self.log.debug("击ipv6按钮")
self.dr.click("xpath->//button[contains(.,'6')]")
def input_network_name(self,value):
@ -29,7 +29,7 @@ class NetwoekPage(basepage.Page):
self.dr.type("xpath->//input[@id='networkName']",value)
def click_vlan_input_box(self):
self.log.debug("击vlan输入框")
self.log.debug("击vlan输入框")
self.dr.click("xpath->//div[@id='addNet_modal']/div[2]/form/div/div[7]/div/div/div/span")
def input_text_new_create(self):
@ -67,11 +67,11 @@ class NetwoekPage(basepage.Page):
self.dr.type("xpath->(//input[@type='text'])[25]",value)
def click_enable_dhcp(self):
self.log.debug("击开启dhcp")
self.log.debug("击开启dhcp")
self.dr.click("xpath->//div[@id='addNet_modal']/div[2]/form/div/div[12]/div/div/span")
def click_save_button(self):
self.log.debug("击保存按钮")
self.log.debug("击保存按钮")
self.dr.click("xpath->//div[@id='addNet_modal']/div[3]/button")
def select_network(self,value):
@ -93,7 +93,7 @@ class NetwoekPage(basepage.Page):
self.dr.click("xpath->//button[contains(.,' 删除')]")
def click_commit_delsubnet_button(self):
self.log.debug("击删除确认按钮")
self.log.debug("击删除确认按钮")
self.dr.click("xpath->//a[contains(.,'确定')]")

View File

@ -26,7 +26,7 @@ class ResSyncPage(basepage.Page):
"/csdp/manage/#/manage-view/resource/sys_ResourceSynchroniz/osphysicalsync")
def click_phy_res_sync(self):
self.log.debug("击物理资源同步到云管")
self.log.debug("击物理资源同步到云管")
self.dr.click("xpath->//span[contains(.,'物理资源同步到云管')]")
def click_select_region(self):
@ -65,7 +65,7 @@ class ResSyncPage(basepage.Page):
self.dr.switch_to_frame("id->syncModal")
def click_refresh_button(self):
self.log.debug("击刷新按钮")
self.log.debug("击刷新按钮")
self.dr.click("xpath->//button[contains(.,' 刷新')]")
def get_text_status(self, value):

View File

@ -14,3 +14,7 @@ class SysimagePage(basepage.Page):
self.log.debug("打开镜像管理页面")
self.dr.open(globalparam.url + "/csdp/manage/#/manage-view/resource/sys_image")
def select_image_name(self,value):
self.log.debug("搜索镜像:%s"%value)
self.dr.type_and_enter("xpath=(//input[@type='text'])[12]",value)

View File

@ -18,7 +18,7 @@ class VdcPage(basepage.Page):
"/csdp/manage/#/manage-view/adminManage/resVDCMgr")
def click_new_vdc_buttun(self):
self.log.debug("击新建vdc按钮")
self.log.debug("击新建vdc按钮")
self.dr.click("xpath->//div[3]/button")
def input_vdc_name(self, value):
@ -26,7 +26,7 @@ class VdcPage(basepage.Page):
self.dr.clear_type("id->vdcName", value)
def click_save_buttun(self):
self.log.debug("击保存按钮")
self.log.debug("击保存按钮")
self.dr.click("css->.modal-footer:nth-child(3) > .btn-warning")
def search_vdc(self, value):
@ -34,11 +34,11 @@ class VdcPage(basepage.Page):
self.dr.type_and_enter("xpath->(//input[@type='text'])[12]", value)
def click_az_buttun(self):
self.log.debug("击可用区按钮")
self.log.debug("击可用区按钮")
self.dr.click("css->.btn-link:nth-child(1)")
def click_new_az_buttun(self):
self.log.debug("击新建可用区")
self.log.debug("击新建可用区")
self.dr.click("css->.mr-5")
def input_az_name(self, value):
@ -46,7 +46,7 @@ class VdcPage(basepage.Page):
self.dr.clear_type("id->vPoolName", value)
def click_resource_type(self):
self.log.debug("击资源类型")
self.log.debug("击资源类型")
self.dr.click(
"xpath->//*[@id='AddandEdit_form']/div/div[2]/div/div/div[1]/span/span[2]/span")
@ -55,7 +55,7 @@ class VdcPage(basepage.Page):
self.dr.type_and_enter("css->.open > .form-control", value)
def click_type(self):
self.log.debug("击类型")
self.log.debug("击类型")
self.dr.click(
"xpath->//*[@id='AddandEdit_form']/div/div[5]/div/div/div[1]/span/span[2]/span")
@ -64,7 +64,7 @@ class VdcPage(basepage.Page):
self.dr.type_and_enter("css->.open > .form-control", value)
def click_data_center(self):
self.log.debug("击数据中心")
self.log.debug("击数据中心")
self.dr.click(
"xpath->//*[@id='AddandEdit_form']/div/div[6]/div/div/div[1]/span/span[2]/span")
@ -77,7 +77,7 @@ class VdcPage(basepage.Page):
self.dr.clear_type("id->vPoolDesc", value)
def click_save_az_buttun(self):
self.log.debug("击保存按钮")
self.log.debug("击保存按钮")
self.dr.click("xpath->//*[@id='AddandEdit']/div[3]/button[1]")
def search_vpool(self, value):
@ -85,25 +85,25 @@ class VdcPage(basepage.Page):
self.dr.type_and_enter("xpath->(//input[@type='text'])[12]", value)
def click_vpool_more_button(self):
self.log.debug("击更多按钮")
self.log.debug("击更多按钮")
self.dr.click("xpath->//td[10]/div/a")
def click_delete_vpool_buttun(self):
self.log.debug("击删除vpool按钮")
self.log.debug("击删除vpool按钮")
self.dr.click("xpath->(//button[@type='button'])[13]")
def click_vpool_delete_btn_success(self):
self.log.debug("击确定按钮")
self.log.debug("击确定按钮")
self.dr.click("xpath->//a[contains(.,'确定')]")
def click_vdc_delete_button(self):
self.log.debug("击删除按钮")
self.log.debug("击删除按钮")
self.dr.click("xpath->(//button[@type='button'])[14]")
def click_vdc_more_button(self):
self.log.debug("击更多按钮")
self.log.debug("击更多按钮")
self.dr.click("xpath->//td[5]/div/a")
def click_vdc_delete_btn_success(self):
self.log.debug("击确定按钮")
self.log.debug("击确定按钮")
self.dr.click("xpath->//a[contains(.,'确定')]")

View File

@ -34,7 +34,7 @@ def driver(request):
def end():
log.info("用例全部执行完毕,关闭浏览器")
time.sleep(1)
time.sleep(globalparam.small)
driver.quit()
request.addfinalizer(end)

View File

@ -15,7 +15,7 @@ class TestLoin():
"""登录测试"""
@allure.story("系统管理员登录系统")
@allure.severity(allure.severity_level.BLOCKER)
@pytest.mark.flaky(reruns=3)
@pytest.mark.flaky(reruns=globalparam.RENUM)
def test_login(self,login_admin):
dr = login_admin
dr.wait(5)

View File

@ -16,7 +16,7 @@ from public.common.publicfunction import *
class TestCreateUser():
"""创建用户"""
@allure.story("创建用户")
@pytest.mark.flaky(reruns=3)
@pytest.mark.flaky(reruns=globalparam.RENUM)
def test_create_user(self,login_admin):
dr = login_admin
datas = datainfo.get_xls_to_dict("user.xlsx", "Sheet1")["创建域管理员"]

View File

@ -19,7 +19,7 @@ class TestAllDomainAdmin():
"""域添加域管理员"""
@allure.story("域添加域管理员")
@pytest.mark.flaky(reruns=3)
@pytest.mark.flaky(reruns=globalparam.RENUM)
def test_allocation_domain_admin(self,login_admin):
dr = login_admin
datas = datainfo.get_xls_to_dict("user.xlsx", "Sheet1")["创建域管理员"]

View File

@ -20,7 +20,7 @@ class TestTeant():
"""创建运营部门"""
@allure.story("创建运营部门")
@pytest.mark.flaky(reruns=3)
@pytest.mark.flaky(reruns=globalparam.RENUM)
def test_create(self,login_domain):
dr = login_domain
t_data = datainfo.get_xls_to_dict("tenantdata.xlsx", "Sheet1")["创建运营部门"]
@ -34,7 +34,7 @@ class TestTeant():
# 搜索运营部门
time.sleep(2)
tpg.input_secrch_tenant(t_data["tenantname"])
time.sleep(1)
time.sleep(globalparam.small)
a = dr.get_text("id->card")
add_image(dr,"创建运营部门")
assert t_data["tenantname"] in a, "%s不在预期结果%s" % (

View File

@ -20,7 +20,7 @@ class TestCreateUser():
"""创建运营部门下的用户测试"""
@allure.story("创建运营部门下的用户")
@pytest.mark.flaky(reruns=3)
@pytest.mark.flaky(reruns=globalparam.RENUM)
def test_create_authuser(self,login_domain):
dr = login_domain
data1s = datainfo.get_xls_to_dict("user.xlsx", "authuser")["创建运营部门用户"]

View File

@ -17,7 +17,7 @@ class TestProject():
"""测试创建项目"""
@allure.story("创建项目")
@pytest.mark.flaky(reruns=3)
@pytest.mark.flaky(reruns=globalparam.RENUM)
def test_create_project(self,login_admin):
dr = login_admin
p_data = datainfo.get_xls_to_dict("projectdata.xlsx", "Sheet1")["创建项目"]

View File

@ -21,7 +21,7 @@ class TestCreateRegion():
"""测试添加资源节点"""
@allure.story("创建资源节点")
@pytest.mark.flaky(reruns=3)
@pytest.mark.flaky(reruns=globalparam.RENUM)
def test_create_region(self,login_domain):
dr = login_domain
p_data = datainfo.get_xls_to_dict("res_node_data.xlsx", "region")["创建资源节点"]
@ -36,7 +36,7 @@ class TestCreateRegion():
regDesc=p_data["regDesc"])
srmpg.open_sys_regionMgr_page()
time.sleep(1)
time.sleep(globalparam.small)
dr.wait(5)
add_image(dr,"创建资源节点")
flag = dr.element_exist(

View File

@ -19,7 +19,7 @@ class TestCreateService():
"""测试添加service"""
@allure.story("创建VMware服务")
@pytest.mark.flaky(reruns=3)
@pytest.mark.flaky(reruns=globalparam.RENUM)
def test_create_service_vmware(self,login_domain):
dr = login_domain
self.arn = resnodeaction.Add_Res_Node(dr)
@ -45,7 +45,7 @@ class TestCreateService():
assert flag
@allure.story("创建opentack服务")
@pytest.mark.flaky(reruns=3)
@pytest.mark.flaky(reruns=globalparam.RENUM)
def test_create_service_openstack(self,login_domain):
dr = login_domain
self.arn = resnodeaction.Add_Res_Node(dr)

View File

@ -17,7 +17,7 @@ class TestCreateEndpoint():
"""测试添加Endpoint"""
@allure.story("VMware创建endpoint")
@pytest.mark.flaky(reruns=3)
@pytest.mark.flaky(reruns=globalparam.RENUM)
def test_vmware_endpoint(self,login_domain):
"""
测试添加vmwareendpoint
@ -36,7 +36,6 @@ class TestCreateEndpoint():
p_data["url"])
time.sleep(0.5)
dr.wait(5)
add_image(dr,"VMware创建endpoint")
text = dr.get_text(
"xpath->//table[@id='accessPoint']/tbody/tr[2]")
@ -44,7 +43,7 @@ class TestCreateEndpoint():
@allure.story("openstack创建endpoint")
@pytest.mark.flaky(reruns=3)
@pytest.mark.flaky(reruns=globalparam.RENUM)
def test_openstack_endpoint(self,login_domain):
"""
测试添加openstackendpoint

View File

@ -21,7 +21,7 @@ class TestPhySunc():
"""物理资源同步"""
@allure.story("同步物理资源")
@pytest.mark.flaky(reruns=3)
@pytest.mark.flaky(reruns=globalparam.RENUM)
def test_sync_phy_res(self,login_domain):
dr = login_domain
p_data = datainfo.get_xls_to_dict("phy_sync_data.xlsx", "Sheet1")["物理资源同步"]
@ -45,7 +45,6 @@ class TestPhySunc():
count1 += 1
if count1 == 10:
break
dr.wait(5)
add_image(dr,"同步物理资源-DC1")
assert status1 == "执行成功"
status2 = dr.get_text(
@ -59,7 +58,6 @@ class TestPhySunc():
count2 += 1
if count2 == 10:
break
dr.wait(5)
add_image(dr,"同步物理资源-DC2")
assert status2 == "执行成功"

View File

@ -21,7 +21,7 @@ class TestCreateVDC():
"""测试创建VDC"""
@allure.story("创建vdc")
@pytest.mark.flaky(reruns=3)
@pytest.mark.flaky(reruns=globalparam.RENUM)
def test_create_vdc(self,login_domain):
dr = login_domain
vdc_a = vdcaction.VdcACction(dr)

View File

@ -22,7 +22,7 @@ class TestCreateVpool():
"""测试创建vpool"""
@allure.story("创建VPOOL")
@pytest.mark.flaky(reruns=3)
@pytest.mark.flaky(reruns=globalparam.RENUM)
def test_create_vpool(self,login_domain):
dr = login_domain
vdc_a = vdcaction.VdcACction(dr)
@ -37,14 +37,13 @@ class TestCreateVpool():
p_data["vpooldesc"])
vdc_pg.open_vdc_page()
time.sleep(1)
time.sleep(globalparam.small)
vdc_pg.search_vdc(p_data["vdcname"])
time.sleep(1)
time.sleep(globalparam.small)
vdc_pg.click_az_buttun()
time.sleep(1)
time.sleep(globalparam.small)
vdc_pg.search_vpool(p_data["vpoolname"])
# 校验能查询到
dr.wait(5)
add_image(dr,"创建VPOOL")
text = dr.get_text("xpath->//td")
assert p_data["vpoolname"] in text

View File

@ -21,7 +21,7 @@ class Test_Vpool_Delete():
"""测试删除vpool"""
@allure.story("删除VPOOL")
@pytest.mark.flaky(reruns=3)
@pytest.mark.flaky(reruns=globalparam.RENUM)
def test_delete_vpool(self,login_domain):
dr = login_domain
vdc_a = vdcaction.VdcACction(dr)
@ -29,10 +29,10 @@ class Test_Vpool_Delete():
p_data = datainfo.get_xls_to_dict("vdc_vpool.xlsx", "vpool")["创建vpool"]
vdc_a.delete_vpool(p_data["vdcname"], p_data["vpoolname"])
vdc_pg.open_vdc_page()
time.sleep(1)
time.sleep(globalparam.small)
vdc_pg.search_vdc(p_data["vdcname"])
vdc_pg.click_az_buttun()
time.sleep(1)
time.sleep(globalparam.small)
vdc_pg.search_vpool(p_data["vpoolname"])
# 校验能查询到
dr.wait(5)

View File

@ -19,7 +19,7 @@ class Test_Vpool_Vdc():
"""测试删除VDC"""
@allure.story("删除VDC")
@pytest.mark.flaky(reruns=3)
@pytest.mark.flaky(reruns=globalparam.RENUM)
def test_delete_vdc(self,login_domain):
dr = login_domain
vdc_a = vdcaction.VdcACction(dr)
@ -27,7 +27,7 @@ class Test_Vpool_Vdc():
p_data = datainfo.get_xls_to_dict("vdc_vpool.xlsx", "vdc")["创建vdc"]
vdc_a.delete_vdc(p_data["vdcname"])
vdc_pg.open_vdc_page()
time.sleep(1)
time.sleep(globalparam.small)
vdc_pg.search_vdc(p_data["vdcname"])
# # 校验能查询到
dr.wait(5)

View File

@ -20,7 +20,7 @@ class TestDeleteUser():
"""删除运营部门下的用户测试"""
@allure.story("删除运营部门下的用户")
@pytest.mark.flaky(reruns=3)
@pytest.mark.flaky(reruns=globalparam.RENUM)
def test_delete_tenant_user(self,login_domain):
dr = login_domain
data1s = datainfo.get_xls_to_dict("user.xlsx", "authuser")["创建运营部门用户"]

View File

@ -20,7 +20,7 @@ class TestProjectDelete():
"""删除项目测试"""
@allure.story("删除项目")
@pytest.mark.flaky(reruns=3)
@pytest.mark.flaky(reruns=globalparam.RENUM)
def test_delete_project(self,login_domain):
dr = login_domain
p_data = datainfo.get_xls_to_dict("projectdata.xlsx", "Sheet1")["创建项目"]

View File

@ -17,7 +17,7 @@ from public.appmodel.loginaction import Login
class TestTenantDelete():
"""删除运营部门测试"""
@allure.story("删除运营部门")
@pytest.mark.flaky(reruns=3)
@pytest.mark.flaky(reruns=globalparam.RENUM)
def test_delete_tenant(self,login_admin):
dr = login_admin
t_data = datainfo.get_xls_to_dict("tenantdata.xlsx", "Sheet1")["创建运营部门"]
@ -32,7 +32,6 @@ class TestTenantDelete():
# 搜索运营部门
tpg.input_secrch_tenant(t_data["tenantname"])
time.sleep(2)
dr.wait(5)
add_image(dr,"删除运营部门")
flag = dr.element_exist("id->card")
assert flag is False

View File

@ -25,7 +25,7 @@ class TestDeleteEndpoint():
"""测试删除Endpoint"""
@allure.story("VMware删除endpint")
@pytest.mark.flaky(reruns=3)
@pytest.mark.flaky(reruns=globalparam.RENUM)
def test_delete_vmware_endpoint(self,login_domain):
"""
测试删除vmwareendpoint
@ -40,7 +40,7 @@ class TestDeleteEndpoint():
p_data["regionname"],
p_data["nodename"],
p_data["servicename"])
time.sleep(1)
time.sleep(globalparam.small)
dr.wait(5)
add_image(dr,"VMware删除endpint")
flag = dr.element_exist(
@ -48,7 +48,7 @@ class TestDeleteEndpoint():
assert flag is False
@allure.story("openstack删除endpoint")
@pytest.mark.flaky(reruns=3)
@pytest.mark.flaky(reruns=globalparam.RENUM)
def test_delete_openstack_endpoint(self,login_domain):
"""
测试删除openstackendpoint
@ -63,7 +63,7 @@ class TestDeleteEndpoint():
p_data["regionname"],
p_data["nodename"],
p_data["servicename"])
time.sleep(1)
time.sleep(globalparam.small)
dr.wait(5)
add_image(dr,"openstack删除endpoint")
flag = dr.element_exist(

View File

@ -24,7 +24,7 @@ from public.common.log import Log
class TestDeleteService():
"""测试删除service"""
@allure.story("删除VMware服务")
@pytest.mark.flaky(reruns=3)
@pytest.mark.flaky(reruns=globalparam.RENUM)
def test_delete_service_vmware(self,login_domain):
dr = login_domain
self.arn = resnodeaction.Add_Res_Node(dr)
@ -46,7 +46,7 @@ class TestDeleteService():
assert flag is False
@allure.story("删除openstack服务")
@pytest.mark.flaky(reruns=3)
@pytest.mark.flaky(reruns=globalparam.RENUM)
def test_delete_service_openstack(self,login_domain):
dr = login_domain
self.arn = resnodeaction.Add_Res_Node(dr)

View File

@ -22,7 +22,7 @@ class TestDeleteRegion():
"""测试添加资源节点"""
@allure.story("删除资源节点")
@pytest.mark.flaky(reruns=3)
@pytest.mark.flaky(reruns=globalparam.RENUM)
def test_delete_region(self,login_domain):
dr = login_domain
p_data = datainfo.get_xls_to_dict("res_node_data.xlsx", "region")["创建资源节点"]
@ -30,7 +30,6 @@ class TestDeleteRegion():
srmpg = sys_regionMgrPage.SysRegionMgrPage(dr)
arn.delete_res_node(p_data["regionname"], p_data["nodename"])
# 搜索项目
dr.wait(5)
add_image(dr,"删除资源节点")
srmpg.open_sys_regionMgr_page()
flag = dr.element_exist(

View File

@ -23,7 +23,7 @@ class TestRemoveDomainAdmin():
"""移除域管理员"""
@allure.story("移除域管理员")
@pytest.mark.flaky(reruns=3)
@pytest.mark.flaky(reruns=globalparam.RENUM)
def test_remove_domain_admin(self,login_admin):
dr = login_admin

View File

@ -23,7 +23,7 @@ class TestDeleteUser():
"""测试删除域管理员"""
@allure.story("删除域用户")
@pytest.mark.flaky(reruns=3)
@pytest.mark.flaky(reruns=globalparam.RENUM)
def test_delete_user(self,login_admin):
dr = login_admin
datas = datainfo.get_xls_to_dict("user.xlsx", "Sheet1")["创建域管理员"]

View File

@ -1,41 +0,0 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2020/02/12 11:05
# @Author : zn
# @Site :
# @File : test_22_create_product_classify.py
# @Software: PyCharm
import pytest
from public.common import datainfo
from public.pages import sysUorgMgrPage
from public.common.publicfunction import *
from public.appmodel import productaction
@allure.feature("服务目录管理")
class TestCreateProduct():
"""创建产品分类"""
@allure.story("创建产品分分类")
# @pytest.mark.flaky(reruns=3)
def test_create_product(self,login_admin):
dr = login_admin #实现系统管理员登录
dr.wait(10)
datas = datainfo.get_xls_to_dict("product.xlsx", "Sheet1")["创建产品分类"]
upage = sysUorgMgrPage.SysUorgMgrPage(dr)
pa = productaction.ProductAction(dr)
pa.create_productclassify(
datas["cname"],
datas["cnum"],
datas["description"])
# upage.input_select_user(datas["username"])
# 查看用户,进行校验
#upage.input_select_user(datas["username"])
#add_image(dr, "创建用户")
#assert dr.element_exist(
# "xpath->//span[contains(.,'%s')]" %
# datas["username"])
if __name__ == "__main__":
pytest.main(["-s", "test_22_create_product_classify.py"])

88
testcase02/conftest.py Normal file
View File

@ -0,0 +1,88 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2019/11/7 14:21
# @Author : mrwuzs
# @Site :
# @File : conftest.py
# @Software: PyCharm
"""
conftest.py 全局变量主要实现以下功能
1添加命令行参数broswer 用于切换不用浏览器
2全局参数driver调用
"""
import time
import pytest
from public.common import pyselenium
from public.common import datainfo
from public.appmodel import loginaction
from config import globalparam
from public.common import log
domain_data = datainfo.get_xls_to_dict("user.xlsx", "Sheet1")["创建域管理员"]
user_data = datainfo.get_xls_to_dict("user.xlsx", "authuser")['创建运营部门用户']
log = log.Log()
@pytest.fixture(scope="session")
def driver(request):
global driver
'''只打开浏览器和关闭浏览器'''
log.info("打开浏览器")
driver = pyselenium.PySelenium(globalparam.browser)
driver.max_window() # 最大化
def end():
log.info("用例全部执行完毕,关闭浏览器")
time.sleep(globalparam.small)
driver.quit()
request.addfinalizer(end)
return driver
@pytest.fixture()
def login_admin(request, driver):
"""系统管理员登录"""
log.info("系统管理员登录")
login = loginaction.Login(driver)
login.login('系统管理员', '123456')
def end():
log.info("测试用例执行完成,登出系统")
driver.origin_driver.delete_all_cookies()
request.addfinalizer(end)
return driver
@pytest.fixture()
def login_domain(request, driver):
"""域管理员登录"""
log.info("域管理员:%s登录" % domain_data["username"])
login = loginaction.Login(driver)
login.login(domain_data["username"], domain_data["password"])
def end():
log.info("测试用例执行完成,登出系统")
driver.origin_driver.delete_all_cookies()
request.addfinalizer(end)
return driver
@pytest.fixture()
def login_user(request, driver):
"""用户登录"""
log.info("用户登录:%s登录" % domain_data["username"])
login = loginaction.Login(driver)
login.login(user_data["username"], user_data["password"])
def end():
log.info("测试用例执行完成,登出系统")
driver.origin_driver.delete_all_cookies()
request.addfinalizer(end)
return driver

View File

@ -1,28 +0,0 @@
# -*- coding: utf-8 -*-
# @Time : 2020/2/6 16:27
# @Author : mrwuzs
# @Email : mrwuzs@outlook.com
# @File : test_01.py
# @Software: PyCharm
import pytest
@pytest.mark.dependency()
@pytest.mark.xfail(reason="deliberate fail")
def test_a():
assert False
@pytest.mark.dependency()
def test_b():
pass
@pytest.mark.dependency(depends=["test_a"])
def test_c():
pass
@pytest.mark.dependency(depends=["test_b"])
def test_d():
pass
@pytest.mark.dependency(depends=["test_b", "test_c"])
def test_e():
pass

View File

@ -0,0 +1,43 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2019/10/25 11:05
# @Author : mrwuzs
# @Site :
# @File : test_01_create_user.py
# @Software: PyCharm
import pytest
from public.common import datainfo
from public.appmodel import useraction
from public.pages import sysUorgMgrPage
from public.common.publicfunction import *
@allure.feature("用户管理")
class TestCreateUser():
"""创建用户"""
@allure.story("创建用户")
@pytest.mark.flaky(reruns=globalparam.RENUM)
def test_create_user(self,login_admin):
dr = login_admin
datas = datainfo.get_xls_to_dict("user.xlsx", "Sheet1")["创建域管理员"]
upage = sysUorgMgrPage.SysUorgMgrPage(dr)
ua = useraction.UserAction(dr)
ua.create_user(
datas["mgrname"],
datas["username"],
datas["firstname"],
datas["password"],
datas["repassword"],
datas["email"])
# upage.input_select_user(datas["username"])
# 查看用户,进行校验
upage.input_select_user(datas["username"])
add_image(dr, "创建用户")
assert dr.element_exist(
"xpath->//span[contains(.,'%s')]" %
datas["username"])
if __name__ == "__main__":
pytest.main(["-s", "test_01_create_user.py"])

View File

@ -1,7 +0,0 @@
# -*- coding: utf-8 -*-
# @Time : 2020/2/6 16:28
# @Author : mrwuzs
# @Email : mrwuzs@outlook.com
# @File : test_02.py
# @Software: PyCharm

View File

@ -0,0 +1,41 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2019/10/25 16:35
# @Author : mrwuzs
# @Site :
# @File : test_02_allocation_domain_administrator.py
# @Software: PyCharm
import pytest
import allure
from time import sleep
from public.common import datainfo
from public.common.publicfunction import *
from public.appmodel import useraction
from public.pages import sysUorgMgrPage
@allure.feature("域管理")
class TestAllDomainAdmin():
"""域添加域管理员"""
@allure.story("域添加域管理员")
@pytest.mark.flaky(reruns=globalparam.RENUM)
def test_allocation_domain_admin(self,login_admin):
dr = login_admin
datas = datainfo.get_xls_to_dict("user.xlsx", "Sheet1")["创建域管理员"]
upage = sysUorgMgrPage.SysUorgMgrPage(dr)
ua = useraction.UserAction(dr)
ua.allocation_domain_administrator(datas["mgrname"], datas["username"])
# 校验已分配域管理角色
upage.open_uorgmgrpage()
upage.input_select_user(datas["username"])
sleep(2)
character = dr.get_text(
"css->.ng-scope:nth-child(4) > .wordBreak")
add_image(dr,"域添加域管理员")
assert character == "1"
# self.assertTrue(dr.element_exist(""]), "用户未创建成功,请查看日志")
if __name__ == "__main__":
pytest.main(["-s", "test_02_allocation_domain_administrator.py"])

View File

@ -0,0 +1,49 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2019/10/25 17:12
# @Author : mrwuzs
# @Site :
# @File : test_03_create_tenant.py
# @Software: PyCharm
import time
import pytest
import allure
from public.common.publicfunction import *
from public.common import datainfo
from public.appmodel import tenantaction
from public.pages import auth_tenant_page
@allure.feature("运营部门管理")
class TestTeant():
"""创建运营部门"""
@allure.story("创建运营部门")
@pytest.mark.flaky(reruns=globalparam.RENUM)
def test_create(self,login_domain):
dr = login_domain
t_data = datainfo.get_xls_to_dict("tenantdata.xlsx", "Sheet1")["创建运营部门"]
tpg = auth_tenant_page.AuthTenantPage(dr)
ta = tenantaction.TenantAction(dr)
ta.create_tenant(
t_data["tenantname"],
t_data["linkmanname"],
t_data["linkmanphoneno"])
tpg.open_authtenant()
# 搜索运营部门
time.sleep(2)
tpg.input_secrch_tenant(t_data["tenantname"])
time.sleep(globalparam.small)
a = dr.get_text("id->card")
add_image(dr,"创建运营部门")
assert t_data["tenantname"] in a, "%s不在预期结果%s" % (
t_data["tenantname"], a)
assert t_data["linkmanname"]in a, "%s不在预期结果%s" % (
t_data["linkmanname"], a)
assert t_data["linkmanphoneno"]in a, "%s不在预期结果%s" % (
t_data["linkmanphoneno"], a)
if __name__ == "__main__":
pytest.main(["-s", "test_03_create_tenant.py"])

View File

@ -0,0 +1,50 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2019/10/25 18:01
# @Author : mrwuzs
# @Site :
# @File : test_04_create_auth_user.py
# @Software: PyCharm
import pytest
import allure
from public.common.publicfunction import *
from public.common import datainfo
from public.appmodel import useraction
from public.pages import authUserPage
@allure.feature("用户管理")
class TestCreateUser():
"""创建运营部门下的用户测试"""
@allure.story("创建运营部门下的用户")
@pytest.mark.flaky(reruns=globalparam.RENUM)
def test_create_authuser(self,login_domain):
dr = login_domain
data1s = datainfo.get_xls_to_dict("user.xlsx", "authuser")["创建运营部门用户"]
aupg = authUserPage.AuthUsertPage(dr)
ta = useraction.UserAction(dr)
ta.create_tenant_user(
data1s["tenantname"],
data1s["username"],
data1s["firstname"],
data1s["password"],
data1s["repassword"],
data1s["email"])
aupg.open_authuser()
aupg.input_select_user(data1s["username"])
add_image(dr,"创建运营部门下的用户")
text = dr.get_text(
"xpath->//div[@class='box-body']/table-component/div/table/tbody")
assert data1s["username"] in text, "%s不在预期结果%s" % (
data1s["username"], text)
assert data1s["firstname"] in text, "%s不在预期结果%s" % (
data1s["firstname"], text)
assert data1s["email"] in text, "%s不在预期结果%s" % (data1s["email"], text)
if __name__ == "__main__":
pytest.main(["-s", "test_04_create_auth_user.py"])

View File

@ -0,0 +1,43 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2019/10/25 17:58
# @Author : mrwuzs
# @Site :
# @File : test_05_create_project.py
# @Software: PyCharm
import pytest
from public.common.publicfunction import *
from public.common import datainfo
from public.appmodel import projectaction
from public.pages import auth_project_page
@allure.feature("项目管理")
class TestProject():
"""测试创建项目"""
@allure.story("创建项目")
@pytest.mark.flaky(reruns=globalparam.RENUM)
def test_create_project(self,login_domain):
dr = login_domain
p_data = datainfo.get_xls_to_dict("projectdata.xlsx", "Sheet1")["创建项目"]
ppg = auth_project_page.AuthProjectPage(dr)
pac = projectaction.PojectAction(dr)
pac.create_project(
p_data["tenantname"],
p_data["projectname"],
p_data["projectdesc"])
ppg.open_authproject()
ppg.input_and_search_project(p_data["projectname"])
add_image(dr,"创建项目")
text = dr.get_text(
"xpath->//div[@class='box-body']/table-component/div/table/tbody")
# 搜索项目
assert p_data["projectname"] in text, "%s不在预期结果%s" % (
p_data["projectname"], text)
assert p_data["tenantname"] in text, "%s不在预期结果%s" % (
p_data["tenantname"], text)
if __name__ == "__main__":
pytest.main(["-s", "test_05_create_project.py"])

View File

@ -0,0 +1,48 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2019/10/25 18:55
# @Author : mrwuzs
# @Site :
# @File : test_06_create_region.py
# @Software: PyCharm
import pytest
import time
import allure
from public.common.publicfunction import *
from public.common import datainfo
from public.appmodel import resnodeaction
from public.pages import sys_regionMgrPage
@allure.feature("资源节点管理")
class TestCreateRegion():
"""测试添加资源节点"""
@allure.story("创建资源节点")
@pytest.mark.flaky(reruns=globalparam.RENUM)
def test_create_region(self,login_domain):
dr = login_domain
p_data = datainfo.get_xls_to_dict("res_node_data.xlsx", "region")["创建资源节点"]
arn = resnodeaction.Add_Res_Node(dr)
srmpg = sys_regionMgrPage.SysRegionMgrPage(dr)
arn.add_res_node(
p_data["regionname"],
p_data["nodename"],
business_type=p_data["business_type"],
platform=p_data["platform"],
virtual_type=p_data["virtual_type"],
regDesc=p_data["regDesc"])
srmpg.open_sys_regionMgr_page()
time.sleep(globalparam.small)
add_image(dr,"创建资源节点")
flag = dr.element_exist(
"xpath->//a[contains(text(),'%s')]" %
p_data["nodename"])
assert flag, "未查询到资源节点%s" % p_data["nodename"]
if __name__ == "__main__":
pytest.main(["-s", "test_06_create_region.py"])

View File

@ -0,0 +1,72 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2019/10/27 19:15
# @Author : mrwuzs
# @Site :
# @File : test_07_create_service.py
# @Software: PyCharm
import pytest
from public.common.publicfunction import *
from public.common import datainfo
from public.appmodel import resnodeaction
from public.pages import sys_regionMgrPage
@allure.feature("资源节点管理")
class TestCreateService():
"""测试添加service"""
@allure.story("创建VMware服务")
@pytest.mark.flaky(reruns=globalparam.RENUM)
def test_create_service_vmware(self,login_domain):
dr = login_domain
self.arn = resnodeaction.Add_Res_Node(dr)
self.srmpg = sys_regionMgrPage.SysRegionMgrPage(dr)
p_data = datainfo.get_xls_to_dict(
"res_node_data.xlsx",
"vmwareapi")["创建service-vmware"]
self.arn.add_resource_service_node_vmware(
p_data["regionname"],
p_data["nodename"],
p_data["servicename"],
p_data["servicetype"],
p_data["username"],
p_data["passwrd"])
# 校验
dr.wait(5)
add_image(dr,"创建VMware服务")
self.srmpg.open_sys_regionMgr_page()
flag = dr.element_exist(
"xpath->(//a[contains(text(),'%s')])" %
p_data["servicename"])
assert flag
@allure.story("创建opentack服务")
@pytest.mark.flaky(reruns=globalparam.RENUM)
def test_create_service_openstack(self,login_domain):
dr = login_domain
self.arn = resnodeaction.Add_Res_Node(dr)
self.srmpg = sys_regionMgrPage.SysRegionMgrPage(dr)
p_data = datainfo.get_xls_to_dict(
"res_node_data.xlsx", "openstackapi")["创建service-keystone"]
self.arn.add_resource_service_node_vmware(
p_data["regionname"],
p_data["nodename"],
p_data["servicename"],
p_data["servicetype"],
p_data["username"],
p_data["passwrd"])
# 校验
self.srmpg.open_sys_regionMgr_page()
add_image(dr,"创建opentack服务")
flag = dr.element_exist(
"xpath->(//a[contains(text(),'%s')])" %
p_data["servicename"])
assert flag
if __name__ == "__main__":
pytest.main(["-s", "test_07_create_service.py"])

View File

@ -0,0 +1,71 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2019/10/27 20:24
# @Author : mrwuzs
# @Site :
# @File : test_08_create_endpoint.py
# @Software: PyCharm
import pytest
from public.common.publicfunction import *
from public.common import datainfo
from public.appmodel import resnodeaction
from public.pages import sys_regionMgrPage
@pytest.mark.usefixtures("driver")
@allure.feature("资源节点管理")
class TestCreateEndpoint():
"""测试添加Endpoint"""
@allure.story("VMware创建endpoint")
@pytest.mark.flaky(reruns=globalparam.RENUM)
def test_vmware_endpoint(self,login_domain):
"""
测试添加vmwareendpoint
依赖已添加vmware服务
:return:
"""
dr = login_domain
self.arn = resnodeaction.Add_Res_Node(dr)
self.srmpg = sys_regionMgrPage.SysRegionMgrPage(dr)
p_data = datainfo.get_xls_to_dict("res_node_data.xlsx", "endpoint")[
"创建vmware-endpoint"]
self.arn.add_endpoint(
p_data["regionname"],
p_data["nodename"],
p_data["servicename"],
p_data["url"])
time.sleep(globalparam.tiny)
add_image(dr,"VMware创建endpoint")
text = dr.get_text(
"xpath->//table[@id='accessPoint']/tbody/tr[2]")
assert p_data["url"] in text
@allure.story("openstack创建endpoint")
@pytest.mark.flaky(reruns=globalparam.RENUM)
def test_openstack_endpoint(self,login_domain):
"""
测试添加openstackendpoint
依赖已添加openstack服务
:return:
"""
dr = login_domain
self.arn = resnodeaction.Add_Res_Node(dr)
self.srmpg = sys_regionMgrPage.SysRegionMgrPage(dr)
p_data = datainfo.get_xls_to_dict(
"res_node_data.xlsx", "endpoint")["创建os-l-endpoint"]
self.arn.add_endpoint(
p_data["regionname"],
p_data["nodename"],
p_data["servicename"],
p_data["url"])
time.sleep(globalparam.tiny)
add_image(dr,"openstack创建endpoint")
text = dr.get_text(
"xpath->//table[@id='accessPoint']/tbody/tr[2]")
assert p_data["url"] in text
if __name__ == "__main__":
pytest.main(["-s", "test_08_create_endpoint.py"])

View File

@ -0,0 +1,66 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2019/10/30 19:05
# @Author : mrwuzs
# @Site :
# @File : test_09_sync_phy_resource.py
# @Software: PyCharm
import time
import pytest
import allure
from public.common.publicfunction import *
from public.common import datainfo
from public.appmodel import ressyncaction
from public.pages import resSyncPage
@allure.feature("资源同步")
class TestPhySunc():
"""物理资源同步"""
@allure.story("同步物理资源")
@pytest.mark.flaky(reruns=globalparam.RENUM)
def test_sync_phy_res(self,login_domain):
dr = login_domain
p_data = datainfo.get_xls_to_dict("phy_sync_data.xlsx", "Sheet1")["物理资源同步"]
sync_a = ressyncaction.ResSync(dr)
sync_pg = resSyncPage.ResSyncPage(dr)
sync_a.phy_res_sync(
p_data["regionname"],
p_data["nodename"],
"DC1",
"DC2")
time.sleep(20)
sync_pg.click_refresh_button()
status1 = dr.get_text(
"xpath->//td[contains(.,'DC1')]/../td[3]").strip()
count1 = 0
while status1 == "执行中":
time.sleep(10)
sync_pg.click_refresh_button()
status1 = dr.get_text(
"xpath->//td[contains(.,'DC1')]/../td[3]").strip()
count1 += 1
if count1 == 10:
break
add_image(dr,"同步物理资源-DC1")
assert status1 == "执行成功"
status2 = dr.get_text(
"xpath->//td[contains(.,'DC2')]/../td[3]").strip()
count2 = 0
while status2 == "执行中":
time.sleep(globalparam.long)
sync_pg.click_refresh_button()
status2 = dr.get_text(
"xpath->//td[contains(.,'DC1')]/../td[3]").strip()
count2 += 1
if count2 == 10:
break
add_image(dr,"同步物理资源-DC2")
assert status2 == "执行成功"
if __name__ == "__main__":
pytest.main(["-s", "test_09_sync_phy_resource.py"])

View File

@ -0,0 +1,42 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2019/10/27 19:16
# @Author : mrwuzs
# @Site :
# @File : test_10_craete_vdc.py
# @Software: PyCharm
import pytest
import allure
from public.common.publicfunction import *
from public.common import datainfo
from public.appmodel import vdcaction
from public.pages import vdcPage
from public.appmodel.loginaction import Login
@allure.feature("VDC管理")
class TestCreateVDC():
"""测试创建VDC"""
@allure.story("创建vdc")
@pytest.mark.flaky(reruns=globalparam.RENUM)
def test_create_vdc(self,login_domain):
dr = login_domain
vdc_a = vdcaction.VdcACction(dr)
vdc_pg = vdcPage.VdcPage(dr)
p_data = datainfo.get_xls_to_dict("vdc_vpool.xlsx", "vdc")["创建vdc"]
vdc_a.ceate_vdc(p_data["vdcname"])
vdc_pg.open_vdc_page()
vdc_pg.search_vdc(p_data["vdcname"])
# 校验能查询到
dr.wait(5)
add_image(dr,"创建vdc")
text = dr.get_text(
"xpath->//div[@class='box-body']/table-component/div/table/tbody")
assert p_data["vdcname"] in text
if __name__ == "__main__":
pytest.main(["-s", "test_10_craete_vdc.py"])

View File

@ -0,0 +1,54 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2019/10/27 19:18
# @Author : mrwuzs
# @Site :
# @File : test_11_ceate_crate_vpool.py
# @Software: PyCharm
import time
import pytest
import allure
from public.common.publicfunction import *
from public.common import datainfo
from public.appmodel import vdcaction
from public.pages import vdcPage
from public.appmodel.loginaction import Login
@allure.feature("VPOOL管理")
class TestCreateVpool():
"""测试创建vpool"""
@allure.story("创建VPOOL")
@pytest.mark.flaky(reruns=globalparam.RENUM)
def test_create_vpool(self,login_domain):
dr = login_domain
vdc_a = vdcaction.VdcACction(dr)
vdc_pg = vdcPage.VdcPage(dr)
p_data = datainfo.get_xls_to_dict("vdc_vpool.xlsx", "vpool")["创建vpool"]
time.sleep(globalparam.middle)
vdc_a.create_vpool(
p_data["vdcname"],
p_data["vpoolname"],
"虚拟资源",
"数据中心",
"DC1",
p_data["vpooldesc"])
vdc_pg.open_vdc_page()
time.sleep(globalparam.small)
vdc_pg.search_vdc(p_data["vdcname"])
time.sleep(globalparam.small)
vdc_pg.click_az_buttun()
time.sleep(globalparam.small)
vdc_pg.search_vpool(p_data["vpoolname"])
# 校验能查询到
add_image(dr,"创建VPOOL")
text = dr.get_text("xpath->//td")
assert p_data["vpoolname"] in text
if __name__ == "__main__":
pytest.main(["-s", "test_11_ceate_crate_vpool.py"])

View File

@ -0,0 +1,57 @@
# -*- coding: utf-8 -*-
# @Time : 2020/2/25 14:33
# @Author : mrwuzs
# @Email : mrwuzs@outlook.com
# @File : test_12_prodcate.py
# @Software: PyCharm
import time
import pytest
from public.common.publicfunction import *
from public.common import datainfo
from config import globalparam
from public.appmodel import folderaction
CASE_DATA = datainfo.get_xls_to_dict("flolderdata.xlsx","产品分类")
@allure.feature("产品分类")
class TestProdCate():
"""测试产品分类"""
@allure.story("创建产品分类-云主机")
@pytest.mark.flaky(reruns=globalparam.RENUM)
def test_create_prodcate_cloudhost(self,login_domain):
self.dr = login_domain
self.pda =folderaction.ProdCategAction(self.dr)
data = CASE_DATA["创建产品分类-云主机"]
time.sleep(globalparam.middle)
self.pda.create_product_class(classname=data["classname"],
classnum=data["classnum"],
classdes=data["classdes"],
prodclass=data["prodclass"])
time.sleep(globalparam.tiny)
response = self.pda.search_product_class(data["classname"])
assert data["classname"] in response
assert data["classdes"] in response
@allure.story("创建产品分类-云磁盘")
@pytest.mark.flaky(reruns=globalparam.RENUM)
def test_create_prodcate_clouddisk(self,login_domain):
self.dr = login_domain
self.pda =folderaction.ProdCategAction(self.dr)
data = CASE_DATA["创建产品分类-云磁盘"]
time.sleep(globalparam.middle)
self.pda.create_product_class(classname=data["classname"],
classnum=data["classnum"],
classdes=data["classdes"],
prodclass=data["prodclass"])
time.sleep(globalparam.tiny)
response = self.pda.search_product_class(data["classname"])
assert data["classname"] in response
assert data["classdes"] in response
if __name__ == "__main__":
pytest.main(["-s", "test_12_prodcate.py"])

View File

@ -0,0 +1,91 @@
# -*- coding: utf-8 -*-
# @Time : 2020/2/25 16:25
# @Author : mrwuzs
# @Email : mrwuzs@outlook.com
# @File : test_13_product_manage.py
# @Software: PyCharm
import pytest
from public.common.publicfunction import *
from public.common import datainfo
from config import globalparam
from public.appmodel import folderaction
from config import globalparam
CASE_DATA = datainfo.get_xls_to_dict("flolderdata.xlsx","产品管理")
@allure.feature("产品分类")
class TestProductMange():
@allure.story("创建产品-云主机")
@pytest.mark.flaky(reruns=globalparam.RENUM)
@pytest.mark.dependency(depends=["test_create_prodcate_cloudhost"])
def test_create_product_cloud_host(self,login_domain):
self.dr = login_domain
self.pra = folderaction.ProductManageAction(self.dr)
data = CASE_DATA["创建产品-云主机"]
time.sleep(globalparam.middle)
self.pra.create_product(productclass=data["productclass"],
platform=data["platform"],
resourcetype=data["resourcetype"],
productname=data["productname"],
productbnum=data["productbnum"],
description=data["description"])
time.sleep(globalparam.tiny)
response = self.pra.search_product(productname=data["productname"])
assert data["productname"] in response
assert data["productclass"] in response
assert data["productbnum"] in response
@allure.story("创建产品-云磁盘")
@pytest.mark.flaky(reruns=globalparam.RENUM)
@pytest.mark.dependency(depends=["test_create_prodcate_cloudhost"])
def test_create_product_cloud_disk(self,login_domain):
self.dr = login_domain
self.pra = folderaction.ProductManageAction(self.dr)
data = CASE_DATA["创建产品-云磁盘"]
time.sleep(globalparam.middle)
self.pra.create_product(productclass=data["productclass"],
platform=data["platform"],
resourcetype=data["resourcetype"],
productname=data["productname"],
productbnum=data["productbnum"],
description=data["description"])
time.sleep(globalparam.tiny)
response = self.pra.search_product(productname=data["productname"])
assert data["productname"] in response
assert data["productclass"] in response
assert data["productbnum"] in response
@allure.story("产品上线-云主机")
@pytest.mark.flaky(reruns=globalparam.RENUM)
@pytest.mark.dependency(depends=["test_create_product_cloud_host"])
def test_onine_product_cloud_host(self,login_domain):
self.dr = login_domain
self.pra = folderaction.ProductManageAction(self.dr)
data = CASE_DATA["产品上线-云主机"]
time.sleep(globalparam.middle)
self.pra.product_online(productname=data["productname"])
time.sleep(globalparam.tiny)
response = self.pra.search_product(productname=data["productname"])
assert "已上线" in response
@allure.story("产品上线-云磁盘")
@pytest.mark.flaky(reruns=globalparam.RENUM)
@pytest.mark.dependency(depends=["test_create_product_cloud_host"])
def test_onine_product_cloud_disk(self,login_domain):
self.dr = login_domain
self.pra = folderaction.ProductManageAction(self.dr)
data = CASE_DATA["产品上线-云磁盘"]
time.sleep(globalparam.middle)
self.pra.product_online(productname=data["productname"])
time.sleep(globalparam.tiny)
response = self.pra.search_product(productname=data["productname"])
assert "已上线" in response
if __name__ == "__main__":
pytest.main(["-s", "test_13_product_manage.py"])

View File

@ -0,0 +1,86 @@
# -*- coding: utf-8 -*-
# @Time : 2020/2/25 21:33
# @Author : mrwuzs
# @Email : mrwuzs@outlook.com
# @File : test_14_product_specification.py
# @Software: PyCharm
import pytest
from public.common.publicfunction import *
from public.common import datainfo
from config import globalparam
from public.appmodel import folderaction
from config import globalparam
CASE_DATA = datainfo.get_xls_to_dict("flolderdata.xlsx","产品规格管理")
@allure.feature("产品分类")
class TestProductSp():
@allure.story("创建产品规格-云主机")
@pytest.mark.flaky(reruns=globalparam.RENUM)
@pytest.mark.dependency()
# @pytest.mark.dependency(depends=["test_create_product_cloud_host"])
def test_create_product_sp_cloud_host(self,login_domain):
self.dr = login_domain
data = CASE_DATA["创建产品规格-云主机"]
self.sp = folderaction.SpecificationAction(self.dr)
self.sp.create_specification(productname=data["productname"],
spname=data["spname"],
sptype=data["sptype"],
spdes=data["spdes"],
vpool=data["vpool"]
)
response = self.sp.search_sp(spname=data["spname"])
assert data["spname"] in response
assert data["productname"] in response
@allure.story("创建产品规格-云磁盘")
@pytest.mark.flaky(reruns=globalparam.RENUM)
@pytest.mark.dependency()
# @pytest.mark.dependency(depends=["test_create_product_cloud_disk"])
def test_create_product_sp_cloud_disk(self,login_domain):
self.dr = login_domain
data = CASE_DATA["创建产品规格-云磁盘"]
self.sp = folderaction.SpecificationAction(self.dr)
self.sp.create_specification(productname=data["productname"],
spname=data["spname"],
sptype=data["sptype"],
spdes=data["spdes"],
vpool=data["vpool"]
)
response = self.sp.search_sp(spname=data["spname"])
assert data["spname"] in response
assert data["productname"] in response
@allure.story("产品规格上线-云主机")
@pytest.mark.flaky(reruns=globalparam.RENUM)
@pytest.mark.dependency(depends=["TestProductSp::test_create_product_sp_cloud_host"])
def test_onine_product_cloud_host(self,login_domain):
self.dr = login_domain
self.sp = folderaction.SpecificationAction(self.dr)
data = CASE_DATA["产品规格上线-云主机"]
time.sleep(globalparam.middle)
self.sp.online_sp( spname=data["spname"])
time.sleep(globalparam.tiny)
response = self.sp.search_sp(spname=data["spname"])
assert "已上线" in response
@allure.story("产品规格上线-云磁盘")
@pytest.mark.flaky(reruns=globalparam.RENUM)
@pytest.mark.dependency(depends=["TestProductSp::test_create_product_sp_cloud_disk"])
def test_onine_product_cloud_disk(self,login_domain):
self.dr = login_domain
self.sp = folderaction.SpecificationAction(self.dr)
data = CASE_DATA["产品规格上线-云磁盘"]
time.sleep(globalparam.middle)
self.sp.online_sp( spname=data["spname"])
time.sleep(globalparam.tiny)
response = self.sp.search_sp(spname=data["spname"])
assert "已上线" in response
if __name__ == "__main__":
pytest.main(["-s", "test_14_product_specification.py"])

2
待改进地方记录.md Normal file
View File

@ -0,0 +1,2 @@
1页面直接的切换不稳定隐式等待和显示等待不能很好的出来目前只能在页面切换的地方用强制sleep来处理
2.磁盘和云主机的操作,对于重名的资源,只能,处理排在第一个