当前位置: 首页 > news >正文

如何做做网站能看人与动物做的网站

如何做做网站,能看人与动物做的网站,网站做等保测评,西安工程网站建设ui自动化po框架 一、po框架 1、基本介绍 #xff08;1#xff09;po模式是page object model的缩写#xff08;简称#xff1a;po或pom#xff09; #xff08;2#xff09; po模式的核心思想#xff1a;分层#xff0c;实现耦合 实现#xff1a;业务流程与页面元素操…ui自动化po框架 一、po框架 1、基本介绍 1po模式是page object model的缩写简称po或pom 2 po模式的核心思想分层实现耦合 实现业务流程与页面元素操作分离的模式。 3作用 a、提高测试用例的可维护性、可读性 b、降低代码的耦合性 c、实现脚本重复使用 二、自动化测试框架分层如下 结构图 框架的思想把整个用例进行拆分6个包 ‘’1、先创建一个dcscms项目 在创建一个conf包存放所有配置文件信息比如项目路径和数据用例的路径 在创建一个包放数据测试数据 在Data包中可以存放xlsx文件数据放测试数据) 测试环境的一些url地址和账号密码可以放在TestDta中 在创建一个report包存放测试报告 在创建一个public公共公开的包(存放一些功能用例) 在public包中创建pages存放元素层流程层封装所有页面的公共方法基类 在public包中创建utils包处理公共类公共函数都存放在此 可以在utils中来读取pages中封装的登录的流程封装读取ini文件或者EXCEL表格的工具类和工具函数 在创建一个TestCase用例包用来存放用例(编写测试用例) 在创建一个run_all用来运行 通过运行测试用例中封装好的用例在运行然后在repot中生成测试报告 实战 一、新建项目 二、在新建6个包 详解 1、在conf包中先把项目的路径和每个包的路径写好 作用方便我们后面引用 定义cms_path的py文件: 此模块用来定义项目及其下面的包的路径import os #导入os模块 #定义项目路径 base_path os.path.dirname(os.path.dirname(__file__)) # 项目所在的路径 # print(base_path) # data路径 data_path os.path.join(base_path,data) # pages路径 pages_path os.path.join(base_path,public,pages) # utils路径 utils_path os.path.join(base_path,public,utils) # report路径 report_path os.path.join(base_path,report) # run路径 run_path os.path.join(base_path,run) # testcase路径 testcase_path os.path.join(base_path,testcase)在创建一个ini文件命名conf.ini 这里都是写配置文件 存放我们测试数据url账号密码url等 [test_data] #节点#section #option url http://cms.duoceshi.cn/cms/manage/login.do username admin password 123456 [exception_data_1] username admin password 654321 [exception_data_2] username admin111 password 654321 [mysql_data] host_name 192.168.1.1 port 3306 username 1233333 [useradd_data] username dcs password 123456 phoneno 13566667777 useremail 12345qq.com useraccount admin8765 userpwd 123456在data中也可以用excel表格写数据和ini一样都可以存放数据 文件名cmsdata.xlsx 编写url和username和passwor 在工具类中封装读取ini文件 read_conf文件 from configparser import ConfigParser from conf.cms_path import * import os class R_conf(ConfigParser):当前这个类是用来处理conf.ini文件的工具类def __init__(self,filename):super(R_conf,self).__init__() #继承父类的构造方法self.filename filename #把传进来的形式参数赋值给到实例变量self.filenameself.read(self.filename) #打开ini文件进行读取def get_value(self,section,option):获取ini文件中的section下面对应的option的value值value self.get(section,option)return value path os.path.join(conf_path,conf.ini) conf R_conf(path) print(conf.get_value(test_data,url))在封装一个读取excel表格类 import openpyxl #操作Excel表格的库 from conf.cms_path import * import osclass R_Excel(object):封装一个班读取Excel表格的工具类def __init__(self,filename,sheet_name):self.filename filenameself.sheet_name sheet_namedef open(self):封装一个打开Excel表格的工具方法#通过openpyxl模块调用load_workbook函数打开filename文件self.wb openpyxl.load_workbook(self.filename)# 通过self.wb这个Excel文件的对象读取对应的sheet页面的self.sh self.wb[self.sheet_name]def read_data(self,row,col):self.open()cell self.sh.cell(rowrow, columncol)return cell.value# if __name__ __main__: # path os.path.join(data_path, testdata.xlsx) # read_excel R_Excel(path, cms_data) # print(read_excel.read_data(1,1))以上都是数据的准备和我们讲的接口自动化前面差不多。 接下来我们开始封装基类在public中的page下新建一个basepage的py文件 比如 所有用例要用到的元素定位以及输入框输入点击下拉等公共方法 我们所有的用例都要继承它跑完关闭我们换一个思路让所有的用例都在在同一个对象里面跑 注解 首先我们创建一个类BasePage(object): BasePage 类是一个基础页面类它使用单例设计模式来确保在整个应用中只创建一个 WebDriver 对象。WebDriver 通常用于自动化浏览器交互例如打开网页、填写表单、点击按钮等。 _driver 是一个类变量用于存储 WebDriver 对象。由于它在类级别定义所以所有实例都可以访问和共享这个变量。 get_driver 是一个类方法用 classmethod 装饰器表示。它用于获取 _driver 变量。 如果 _driver 为空即还没有创建 WebDriver 对象则创建一个新的 WebDriver 对象并将其赋值给 _driver。 如果 _driver 不为空则直接返回它。 这种设计使得在整个应用中不论你创建多少个 BasePage 的实例你都会得到同一个 _driver 对象。这对于在多线程环境下进行自动化测试或网页交互非常有用因为它确保了所有线程都使用同一个 WebDriver 实例 driver None是一种常见的写法用于声明一个变量并初始化为None。这种写法表明driver变量在初始状态下没有赋值。 这个写法通常用于以下情况 初始化变量当你需要声明一个变量但不确定它的初始值时可以将它初始化为None。这表示该变量当前没有有效的值。 判断变量是否被赋值通过检查变量是否为None可以判断该变量是否已经被赋值。如果变量为None则说明它还没有被赋值。 占位符在编写代码时有时候需要声明一个变量但暂时不需要使用它。为了不影响代码的执行可以将它初始化为None作为占位符使用。 所以我们创建类方法 classmethod 为什么我们创建类方法因为类方法可以直接被类调用 class BasePage(object):_driver None #声明一个变量并初始化为Noneclassmethoddef get_driver(cls): #通过get_driver获取driver对象#单例设计模式是为了保证每个用例用的都是同一个浏览器对象#比如篮球场上进行100次进行投篮练习100个篮球练习用同一个篮球进行100次投篮这就是单例模式if not cls._driver:cls._driver webdriver.Chrome() #return cls._driver #以上是一个单例模式 #除了打开浏览器以外我们还要进行元素定位我们也封装一个类方法名字是find_elemnet #比如 baiduid‘kw’classmethod #def find_element(cls,element):#定位元素我们用了很多种元素定位方法,对selenium的元素定位方法进行二次封装到时候进行元素定位的时候只需要调用同一个方法就行了参数不一样:param element: 元素属性type_name element[0]value_name element[1] if type_name id: #可以写一个if多分支方法ele cls._driver.find_element_by_id(value_name)elif type_name name:ele cls._driver.find_element_by_name(value_name)elif type_name class:ele cls._driver.find_element_by_class_name(value_name)elif type_name xpath:ele cls._driver.find_element_by_xpath(value_name)elif type_name tag_name:ele cls._driver.find_element_by_tag_name(value_name)elif type_name link_text:ele cls._driver.find_element_by_link_text(value_name)elif type_name partial_link_text:ele cls._driver.find_element_by_partial_link_text(value_name)elif type_name css:ele cls._driver.find_element_by_css_selector(value_name)else:raise ValueError(请输入正确的属性参数) #如果不是输入定位方法不对手动触犯异常请输入正确的参数return ele #把网页元素返回去这里我们封装一个定位元素工具方法方便只要你传元素方法和元素属性值classmethoddef click(cls,ele):return ele.click()classmethoddef sendKeys(cls,ele,text):封装输入内容的方法:param ele: 元素对象:param text: 文本信息:return:return ele.send_keys(text)classmethoddef sleep(cls,sec):封装一个线程等待方法:param sec: 等待的时间单位为秒:return:return sleep(sec)classmethoddef wait(cls,sec):封装一个隐式等待:param sec::return:return cls._driver.implicitly_wait(sec)classmethoddef get_text(cls,ele):封装一个获取元素的文本信息的方法:param ele::return:return ele.textclassmethoddef get_attribute(cls,ele,typename):return ele.get_attribute(typename)classmethoddef maximize_window(cls):return cls._driver.maximize_window()classmethoddef switch_frame(cls,ele):return cls._driver.switch_to.frame(ele)if __name__ __main__:driver BasePage.get_driver()driver.get(http://cms.duoceshi.cn/cms/manage/login.do)sleep(2)ele BasePage.find_element((id,userAccount))ele.send_keys(admin) 接下来我们写用例 写下登录和用户中心的用例 此模块用来编写登录的测试用例 from config.config import * from public.pages.base_page import BasePage from public.pages.pages_element import Pages_Element as p from public.utils.handle_excel import Read_Excel from public.utils.handle_ini import Read_Ini import unittest import os#获取访问页面的url地址 ini_file os.path.join(data_path,data.ini) read Read_Ini(ini_file) url read.read_ini(test_data,url) username read.read_ini(test_data,username) passwd read.read_ini(test_data,password)ex_username read.read_ini(exception_data_1,username) ex_passwd read.read_ini(exception_data_1,password)class Test_Login(unittest.TestCase):classmethoddef setUpClass(cls):cls.driver BasePage.get_driver()classmethoddef tearDownClass(cls):BasePage.sleep(3)del cls.driverdef setUp(self):self.driver.get(url)self.driver.maximize_window()BasePage.sleep(3)def test_1_login(self):ele BasePage.find_element(p.userName)BasePage.sendKeys(ele,username)BasePage.wait(5)ele2 BasePage.find_element(p.passWord)BasePage.sendKeys(ele2,passwd)BasePage.wait(5)ele3 BasePage.find_element(p.loginBtn)BasePage.click(ele3)ele4 BasePage.find_element(p.exitBtn)value BasePage.get_attribute(ele4,title)self.assertEqual(value,退出)BasePage.sleep(2)def test_2_login(self):ele BasePage.find_element(p.userName)BasePage.sendKeys(ele,ex_username)BasePage.wait(5)ele2 BasePage.find_element(p.passWord)BasePage.sendKeys(ele2,ex_passwd)BasePage.wait(5)ele3 BasePage.find_element(p.loginBtn)BasePage.click(ele3)BasePage.sleep(2)def test_3_login(self):passif __name__ __main__:unittest.main() 添加用户 #coding:utf-8from config.config import * from public.pages.base_page import BasePage from public.pages.pages_element import Pages_Element as p from public.utils.handle_excel import Read_Excel from public.utils.handle_ini import Read_Ini from public.utils.login import Cms_Login as cm import unittest import osini_path os.path.join(data_path,data.ini) read Read_Ini(ini_path)usrname read.read_ini(useradd_data,username) pwd read.read_ini(useradd_data,password) phoneno read.read_ini(useradd_data,phoneno) useremail read.read_ini(useradd_data,useremail) useraccount read.read_ini(useradd_data,useraccount) userpwd read.read_ini(useradd_data,userpwd)class Test_Adduser(unittest.TestCase):classmethoddef setUpClass(cls):cls.driver cm().suc_login()classmethoddef tearDownClass(cls):del cls.driverdef play(self):passdef test_1_adduser(self):ele1 BasePage.find_element(p.menuUser)BasePage.click(ele1)BasePage.sleep(1)ele2 BasePage.find_element(p.userMana)BasePage.click(ele2)BasePage.sleep(1)ele3 BasePage.find_element(p.iframe1)BasePage.switch_frame(ele3)BasePage.wait(3)ele4 BasePage.find_element(p.addUserBtn)BasePage.click(ele4)BasePage.wait(3)ele5 BasePage.find_element(p.iframe2)BasePage.switch_frame(ele5)BasePage.wait(3)ele6 BasePage.find_element(p.customerName)BasePage.sendKeys(ele6,usrname)if __name__ __main__:unittest.main() 我们针对定位元素也可以封装 建py文件一个命名pages_elemnet我们可以把所有的元素定位放在这个文件中 按照定位流程书写 我们把页面元素定位进行抽离的四项被称为po模式 此模块用来保存各个页面的网页元素的属性信息 class Pages_Element():此类用来存放网页元素的属性信息# 1、用户名输入框的属性userName (id,userAccount)# 2、密码输入框的属性passWord (id,loginPwd)# 3、登录按钮的属性loginBtn (id,loginBtn)# 4、登录页取消按钮的属性cancelBtn (xpath,//*[iduserloginform]/div[4]/input[2])# 5、退出按钮的属性exitBtn (xpath,/html/body/header/span[2]/a)# 6、个人中心按钮的属性menuUser (xpath,//*[idmenu-user]/dt)# 7、用户管理选项的属性userMana (link_text,用户管理)# 8、第一层iframe框的属性iframe1 (name,/cms/manage/user-list.html)# 9、添加用户按钮的属性addUserBtn (partial_link_text,添加用户)# 10、第二层iframe框的属性iframe2 (name,xubox_iframe1)# 11、用户姓名输入框属性 ----- 添加用户操作customerName (name,userName)# 12、手机号输入框属性 ----- 添加用户操作phoneNumber (id,user-tel)# 13、登录用户输入框属性 ---- 添加用户操作userAccount (id,userAccount)# 14、登录用户密码输入框属性 ---- 添加用户操作loginPwd (id,loginPwd)# 15、二次确认密码输入框属性 ------- 添加用户操作confirmPwd (id,confirmPwd)# 16、邮箱输入框属性 ------- 添加用户操作userEmail (id,user-email)# 17、提交按钮属性 ---------- 添加用户操作submitBtn (id,submitBtn) 假如我要写第二条用例的时候 然后再运行用例 #coding:utf-8import sys sys.path.append(.) #添加当前所在的目录到环境变量中 sys.path.append(..) #添加上级目录到环境变量中import unittest from public.utils.HTMLTestRunnerNew import HTMLTestRunner import os from config.config import * def run_all(report_file,sd,pt,tester):f open(report_file,wb)suite1 unittest.defaultTestLoader.discover(start_dirsd,patternpt)runner HTMLTestRunner(streamf,titleui自动化测试报告,description运行结果如下,testertester)runner.run(suite1) if __name__ __main__:report_file os.path.join(report_path,report_ui.html)run_all(report_file,testcase_path,test*.py,dcs)
http://www.yutouwan.com/news/380587/

相关文章:

  • wordpress多站点问题网站地图灰色效果的怎么做的
  • 集美网站建设阿里云服务器做盗版视频网站
  • 旅游类网站设计镇江网站制作费用
  • 网站服务器规划 用户数网站需要每个城市做推广吗
  • 做网站的费用如何写分录西安搬家公司电话附近联系方式
  • 哈尔滨营销网站制作3d网页游戏开服表
  • 专门做设计的网站有哪些做项目的编程网站
  • h5开发网站优点上海元山建设有限公司网站
  • 东营网站建设价钱表抖音小程序开发公司
  • 石家庄网站建设费用工程建设承包合同
  • 用网站做自我介绍做电商网站一般多少钱
  • 青岛做家纺的公司网站android开发下载wordpress
  • 门户网站模板html5龙岗网络推广
  • 成都专业网站建设套餐西安网站设计开发
  • 农业推广网站建设儿童教育网站怎么做有趣
  • 网站集群建设方案网络推广排名
  • 当雄网站建设焦点网站设计
  • 搭建一个商城类网站临沂手机网站制作
  • 网站的备案信息教务系统网站怎么做
  • 自己建网站服务器网站文章快速被收录
  • 长宁苏州网站建设公司百度平台官网
  • 学做ppt的网站有哪些空间除了可以做网站还能干什么
  • 给女生做网站长春网站建设及推广
  • 快速搭建网站 数据存储黄骅市有什么好玩的地方
  • 全屏企业网站一个网站的建设流程有哪些
  • 深圳云网站建站公司网页怎么制作四页
  • 网站自助建站系统wordpress邮件营销
  • asp.net获取网站地址网站定制怎么收费
  • 网站设计手机平面设计常用的软件有哪些
  • 手机网站前端设计做网站需要几万块吗