python UI自动化实战记录五:测试页面2 pageobject
该部分记录测试页面2-StrategyPage,所有页面2上的元素定位、操作、获取属性等方法都写在该类中。
1 页面2继承自BasePage;
2 页面2第一部分写的是所有的定位器
3 页面2第二部分类的方法,包括提取页面元素,页面元素的操作、获取属性、验证元素属性正确性等
4 当用例中需要用到该页面的某元素或操作时,补充方法到该类中,再在用例中调用
5 页面数据最后要与接口对比,需要将接口类和页面类返回的值数据类型等进行统一,方便用例的编写。
#coding:utf-8 """
策略页面类
LOCATOR : 所有页面元素的定位器
策略页面元素的定位和操作均写在该类中
""" from .basepage import BasePage
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.by import Byimport logging;logging.basicConfig(level=logging.INFO) class StrategyPage(BasePage):
"""
策略页面类
""" #LOCATOR
_selectedStrategyName_locator = (By.ID, "selectedStrategyName")
_selectedstragegy_locator = (By.CSS_SELECTOR, "#strategyList dd.actived")
_navinfo_locator = (By.CSS_SELECTOR,"#estimationRightInfo .ifund-zf li")
_groupRiseTbody_locator = (By.ID, "groupRiseTbody")
_h1_locator = (By.TAG_NAME,"h1")
_p_locator = (By.TAG_NAME,"p")
_span_loacator = (By.TAG_NAME,"span")
_tr_locator = (By.TAG_NAME,"tr")
_td_locator = (By.CSS_SELECTOR,"td div")
_dd_locator = (By.TAG_NAME,"dd")
_pattern_locator = (By.CSS_SELECTOR,"#groupTechContainer .switch-header-i.actived")
_patterns_locator = (By.CSS_SELECTOR,"#groupTechContainer .switch-header-i")
_peroid_locator = (By.CSS_SELECTOR,"#groupTechContainer .switch-container li.actived")
_name_locator = (By.ID,"selectedStrategyName")
_strategystyle_locator = (By.CSS_SELECTOR, "#poptype li")
_strategylevel_locator = (By.CSS_SELECTOR, "#strategyList dd")
_peroids_locator = (By.CSS_SELECTOR,"#groupTechContainer .switch-container .charttype li")
_startdate_locator = (By.ID,"mdStart")
_spchart_locator = (By.ID, "spchartType")
_percentRun_locator = (By.ID, "percentRun")
_percentDiff_locator = (By.ID, "percentDiff")
_yield_locator = (By.ID,"yield")
_mdStartEnd_locator = (By.ID, "mdStart-End")
_adjustdate_locator = (By.ID,"selAdjustDates")
_strategyinfo_locator = (By.ID, "strategyinfo")
_memo_locator = (By.CLASS_NAME, "s-tips")
_details_locator = (By.CSS_SELECTOR, ".s-details dl")
_maxretrace_locator = (By.ID, "maxretrace")
_sharpeRun_locator = (By.ID, "sharpeRun")
_sharpeDiff_locator = (By.ID, "sharpeDiff")
_xpRate_locator = (By.ID, "xpRate")
_js_totop = "scrollTo(0,0)"
_js_trends = 'document.getElementsByClassName("ifund-module-i")[1].scrollIntoView()'
_js_adjustdate = 'document.getElementById("selAdjustDates").scrollIntoView()'
_js_percents = 'document.getElementById("groupRiseTbody").scrollIntoView()' def open_strategy_page(self,sso):
"""打开策略页面"""
domain = "http://testdomain"
strategyurl = '/strategy'
url = domain + strategyurl + '?' + sso
self.openpage(url) def get_code(self):
self.strategycode = self.getelement(*StrategyPage._selectedstragegy_locator).get_attribute("data-code") #获取策略code
return self.strategycode def get_strategyinfo(self):
"""获取页面策略代码、名称信息"""
self.selectedStrategyName = self.getelement(*StrategyPage._selectedStrategyName_locator).text # 选中的策略风格名称
self.selectedstragegy = self.getelement(*StrategyPage._selectedstragegy_locator) self.strategystyle = self.selectedstragegy.get_attribute("data-style") # 选中的策略类型
self.strategycode = self.selectedstragegy.get_attribute("data-code") # 选中的策略代码
self.strategyname = self.selectedstragegy.text # 选中的策略名称
logging.info("当前策略:%s_%s"%(self.selectedStrategyName,self.strategycode))
return self.strategycode def get_navinfo(self):
"""页面净值数据"""
logging.info("基金净值")
self.driver.execute_script(StrategyPage._js_totop) # 返回顶部
self.getscreenshot("净值")
navinfo = self.getelements(*StrategyPage._navinfo_locator) # 净值模块
nav = self.getchild(navinfo[0],*StrategyPage._h1_locator).text # 净值
navDate = self.getchild(navinfo[0],*StrategyPage._p_locator).text[-6:-1] # 净值日期
navChange = self.getchild(navinfo[1],*StrategyPage._span_loacator).text[:-1] # 净值日涨幅
annualChangeAll = self.getchild(navinfo[2],*StrategyPage._span_loacator).text[:-1] # 年化回报
self.navlist = [float(nav), navDate, float(navChange), float(annualChangeAll)]
return self.navlist def get_percents(self):
"""页面组合涨幅数据"""
self.driver.execute_script(StrategyPage._js_percents) #显示到页面
logging.info("组合涨幅")
self.getscreenshot("组合涨幅")
self.percents_list = []
groupRiseTbody = self.getelement(*StrategyPage._groupRiseTbody_locator)
trlist = self.getchilds(groupRiseTbody,*StrategyPage._tr_locator) #获取组合涨幅的数据
trlen = len(trlist)
for i in range(trlen):
tdlist = self.getchilds(trlist[i],*StrategyPage._td_locator)
tddatalist = [ele.text.replace('%','') for ele in tdlist] #取出值并去掉%
for i in range(len(tddatalist)): #转化成浮点数
try:
tddatalist[i] = float(tddatalist[i])
except:
pass #不能转化成浮点的忽略
self.percents_list.append(tddatalist)
return self.percents_list def get_actived_pattern(self):
"""获取当前选中的定投方式""" pattern = self.getelement(*StrategyPage._pattern_locator)
self.pattern = pattern.get_attribute("data-type")
return self.pattern def get_actived_peroid(self):
"""获取当前选中的投资期限""" peroid = self.getelement(*StrategyPage._peroid_locator)
self.peroid = peroid.get_attribute("data-type")
return self.peroid def choose_style(self,styleindex):
"""选择策略风格"""
strategyListdt = self.getelement(*StrategyPage._name_locator) # 找到当前所选策略
self.driver.execute_script(StrategyPage._js_totop) #返回顶部
strategyListdt.click() # 点击显示下拉列表
self.wait(0.5)
strategystylelist = self.getelements(*StrategyPage._strategystyle_locator) # 下拉框选项列表
selectstrategy = strategystylelist[styleindex]
self.selectStrategystyle = selectstrategy.get_attribute("data-style") # 选择的类型
self.selectStrategyName = selectstrategy.text # 选择的stylename
selectstrategy.click() # 点击风格
self.wait(1) def check_chooseresult(self):
"""验证选择的类型与页面显示类型一致"""
if self.selectedStrategyName == self.selectStrategyName and self.strategystyle == self.selectStrategystyle:
return True def choose_level(self,levelindex):
"""选择策略级别"""
strategylevellist = self.getelements(*StrategyPage._strategylevel_locator) # 策略子类型列表
self.strategylevellist = [item for item in strategylevellist if item.is_displayed()] #移除不显示的元素
strategylevel = self.strategylevellist[levelindex]
strategylevel.click() #点击策略子类型
self.wait(1)
return def choose_strategy(self,styleindex,levelindex):
"""选择策略风格和级别并获取策略信息"""
self.choose_style(styleindex) # 选择策略风格
self.choose_level(levelindex) # 选择级别
self.get_strategyinfo() # 选择后获取信息
styleinfo = "益策略选择S00%s00%s"%(styleindex+1,levelindex+1)
self.getscreenshot(styleinfo)
logging.info(styleinfo) def choose_trends_pattern(self,patternindex):
"""选择组合走势的定投方式"""
self.driver.execute_script(StrategyPage._js_trends) #定投方式显示到界面,否则无法点击
self.patternlist = self.getelements(*StrategyPage._patterns_locator) # 定投方式
patternele = self.patternlist[patternindex]
patternele.click() # 选择定投方式
self.wait(1)
self.pattern = patternele.get_attribute("data-type") #获取定投方式K,W
self.peroidlist = self.getelements(*StrategyPage._peroids_locator) #获取时间区间 def choose_trends_peroid(self,peroidindex):
"""选择投资期限,获取组合走势开始日期和业绩表现数据"""
peroidele = self.peroidlist[peroidindex]
peroidele.click() # 点击时间区间
self.wait(2)
self.peroid = peroidele.get_attribute("data-type") #时间区间
self.get_trends()
#log和截图
trendinfo = "组合走势{pattern}_{peroid}".format(pattern=self.pattern,peroid=self.peroid)
logging.info(trendinfo)
self.getscreenshot(trendinfo) def get_trends(self):
"""获取组合走势起始日期和业绩表现页面数据"""
self.startdate = self.getelement(*StrategyPage._startdate_locator).text # 起始日期
strategycode = self.get_code() """业绩表现页面数据"""
self.spchartType = self.getelement(*StrategyPage._spchart_locator).text #周期
self.percentRun = self.getelement(*StrategyPage._percentRun_locator).text #收益率超出、跑输
self.percentDiff = float(self.getelement(*StrategyPage._percentDiff_locator).text[:-1]) #收益率与业绩基准比较的绝对值
self.yieldp = float(self.getelement(*StrategyPage._yield_locator).text[:-1]) #收益率
mdStart_End = self.getelement(*StrategyPage._mdStartEnd_locator).text #最大回撤区间
self.mdstart = mdStart_End[:10].replace('/', '-') #转化成与接口一样的格式
self.mdend = mdStart_End[-10:].replace('/', '-') #转化成与接口一样的格式 self.maxretrace = float(self.getelement(*StrategyPage._maxretrace_locator).text[:-1]) #最大回撤
self.sharpeRun = self.getelement(*StrategyPage._sharpeRun_locator).text #夏普超出、跑输
self.sharpeDiff = float(self.getelement(*StrategyPage._sharpeDiff_locator).text[:-1]) #夏普比率比较绝对值
self.xpRate = self.getelement(*StrategyPage._xpRate_locator).text[:-1] #夏普比率
try:
self.xpRate = float(self.xpRate) # 有数值转换,无数值不转换
except:
pass result = [strategycode,self.startdate, self.percentRun, self.percentDiff, self.yieldp,self.maxretrace,self.sharpeRun,
self.sharpeDiff, self.xpRate, self.mdstart,self.mdend]
return result def get_strategy_adjustdate(self):
"""获取策略配置调仓日期"""
self.selAdjustDatesselect = Select(self.getelement(*StrategyPage._adjustdate_locator)) #调仓日期选择框
self.adjustDate = self.selAdjustDatesselect.first_selected_option.text #当前选中的日期
self.adjustDatelist = [opt.get_attribute("value") for opt in self.selAdjustDatesselect.options] #取出所有的调仓日期
return self.adjustDate def choose_adjustdate(self,adjustdate):
"""选择调仓日期并获取配置"""
self.driver.execute_script(StrategyPage._js_adjustdate) #调仓日期显示到页面
self.selAdjustDatesselect.select_by_value(adjustdate) #选择调仓日期
self.wait(0.5)
#log和截图
infos = "{adjustdate}配置".format(adjustdate=adjustdate)
logging.info(infos)
self.getscreenshot(infos) def get_strategy_settings(self):
""" 获取页面策略配置数据"""
self.samples = []
strategyinfo = self.getelement(*StrategyPage._strategyinfo_locator) #策略信息模块
self.memo = self.getchild(strategyinfo,*StrategyPage._memo_locator).text #memo
strategydetails = self.getchilds(strategyinfo,*StrategyPage._details_locator) #策略配置列表
for dl in strategydetails:
parenttype = self.getchild(dl,*StrategyPage._span_loacator).text #配置大项
ddlist = self.getchilds(dl,*StrategyPage._dd_locator) #配置子项
for dd in ddlist:
sample = [parenttype]
childtypelist = self.getchilds(dd,*StrategyPage._span_loacator)
childtype = childtypelist[0].text #子项代码和名称
name,ticker= childtype.split(" ") #按空格划分
sample += [ticker,name]
sample.append(float(childtypelist[1].text[:-1])) #子项权重
self.samples.append(sample)
self.samples = sorted(self.samples)
the end!
python UI自动化实战记录五:测试页面2 pageobject的更多相关文章
- python UI自动化实战记录七:页面2用例编写
使用python自带的unittest测试框架,用例继承自unittest.TestCase类. 1 引入接口类和页面类 2 setUp函数中打开页面,定义接口对象 3 tearDown函数中关闭页面 ...
- python UI自动化实战记录六:页面1用例编写
使用python自带的unittest测试框架,用例继承自unittest.TestCase类. 1 引入接口类和页面类 2 setUp函数中打开页面,定义接口对象 3 tearDown函数中关闭页面 ...
- python UI自动化实战记录四:测试页面1-pageobject
该部分记录测试页面1-IndexPage,所有首页上的元素定位.操作.获取属性等方法都写在该类中. 1 首页类继承自BasePage 2 首页类第一部分写的是所有的定位器 3 首页类第二部分类的方法, ...
- python UI自动化实战记录十一: 总结
首先说说为什么想起来用自动化脚本来实现该项目的自动化. 工作还是以手工测试为主,业务驱动型的项目大概就是这样,业务不停地变,不断的迭代. 自动化测试实施的先决条件: 一 得有时间. 如果有时间大部分的 ...
- python UI自动化实战记录三:pageobject-基类
脚本思路: 使用pageobject模式,写一个basepage基类,所有页面的通用方法封装到基类中.比如打开页面,关闭页面,等待时间,鼠标移到元素上,获取单个元素,获取一组元素,获取元素的子元素,截 ...
- python UI自动化实战记录一:测试需求与测试思路
测试需求: 项目包含两个数据展示页面,数据均来自于四个数据源接口. 测试操作步骤: 选择5个大类型中的一个,每个大类型下有3个子类型,选择任一子类型,页面数据更新.需验证页面上的数据与数据源接口数据一 ...
- python UI自动化实战记录十:执行测试及测试报告
使用简单的unittest.TextTestRunner. 思路: 1 在report目录下创建当日测试报告目录 20190113 2 创建测试报告文件 f = 时间戳.txt 3 加载测试集,运行测 ...
- python UI自动化实战记录二:请求接口数据并提取数据
该部分记录如何获取预期结果-接口响应数据,分成两步: 1 获取数据源接口数据 2 提取后续页面对比中要用到的数据 并且为了便于后续调用,将接口相关的都封装到ProjectApi类中. 新建python ...
- python UI自动化实战记录八:添加配置
添加配置文件写入测试地址等,当环境切换时只需修改配置文件即可. 1 在项目目录下添加文件 config.ini 写入: [Domain] domain = http://test.domain.cn ...
随机推荐
- c#异步编程async await
可以代替协程了 但是需要.net4 版本 unity2017以上版本可以用了 再也可以不用蛋疼的没有返回值的协程了 //异步编程,和Task一起用 async void TestAsync(){ // ...
- unity代码设置鼠标样式
public class Main : MonoBehaviour { public Texture2D cursorTexture;//图片 public CursorMode cursorMode ...
- PyCharm鼠标右键不显示Run unittest方法
PyCharm鼠标右键不显示Run unittest方法 PyCharm是一个用来写python代码的IDE,很好用.在其中建立了unittest类后,鼠标点击某个test方法后,菜单中会显示Run ...
- 项目管理系列--从零开始Code Review[转]
从零开始Code Review 这篇帖子不是通篇介绍Code Review的方法论, 而是前大段记录了我们团队怎么从没有这个习惯到每天都进行review的过程, 后小段给出了我的一些建议. 希望能对诸 ...
- 常用工具说明--Maven使用说明
什么是Maven? 如今我们构建一个项目需要用到很多第三方的类库,如写一个使用Spring的Web项目就需要引入大量的jar包.一个项目Jar包的数量之多往往让我们瞠目结舌,并且Jar包之间的关系错综 ...
- [转]ASP.NET Web API基于OData的增删改查,以及处理实体间关系
本文转自:http://www.cnblogs.com/darrenji/p/4926334.html 本篇体验实现ASP.NET Web API基于OData的增删改查,以及处理实体间的关系. 首先 ...
- centos下不重装php——给PHP添加新扩展库
装完php.发现需要一些新扩展库比如常见的mysqli之类的.在不重装php安装新扩展,以一个不常用的库xsl为例. 环境:centos6.8,php5.3.29 ,osx10.11.6 我的php相 ...
- 关于逻辑删除标识字段value的设定
为了容易记忆,项目里所有表记录的逻辑删除可以用“-1”(或其他值)来表示.
- Sequence contains no elements : LINQ error
1.错误意思: 出现错误的原因是:你要从一个null中取的数据. 2.错误的处理 1,使用FirstOrDefault() 来代替 First() 2.使用SingleOrDefault 来代替 Si ...
- 《MySQL 基础课程》笔记整理(进阶篇)(未完)
一.MySQL服务安装及命令使用 安装过程就不写了,毕竟百度经验一大把 MySQL 官方文档 MySQL 参考手册中文版 1.MySQL简介 RDBMS(Relational Database M ...