python UI自动化实战记录四:测试页面1-pageobject
该部分记录测试页面1-IndexPage,所有首页上的元素定位、操作、获取属性等方法都写在该类中。
1 首页类继承自BasePage
2 首页类第一部分写的是所有的定位器
3 首页类第二部分类的方法,包括提取页面元素,页面元素的操作、获取属性、验证元素属性正确性等
4 当用例中需要用到该页面的某元素或操作时,补充方法到该类中,再在用例中调用
5 函数名:open打头的表示 打开页面,get_表示获取页面元素或属性,check_表示验证页面数据是否一致,choose_表示元素选择,click_点击。
6 clicklink_read_strategy() 函数点击按钮之后会跳转到页面2。需将driver返回用于创建页面2对象。
#coding:utf-8
"""
首页
LOCATOR : 所有页面元素的定位器
首页页面元素的定位和操作均写在该类中
""" from .basepage import BasePage
from selenium.webdriver.common.by import By
import logging;logging.basicConfig(level=logging.INFO) class IndexPage(BasePage):
"""
首页类
"""
#LOCATOR
_stylelist_LOCATOR = (By.CSS_SELECTOR, "#styleList li[data-style]")
_current_LOCATOR = (By.CSS_SELECTOR,"#styleList .current")
_latestInfoList_LOCATOR = (By.CSS_SELECTOR, "ul#latestInfoList>li")
_mystyle_name__LOCATOR = (By.ID, "myStyle_name_")
_mystyle_name_LOCATOR = (By.ID, "myStyle_name")
_style_desc_LCOATOR = (By.CLASS_NAME, "style-desc")
_myStyle_remark_LOCATOR = (By.ID, "myStyle_remark")
_read_strategy_LOCATOR = (By.CLASS_NAME, "read-strategy")
_style_desc_item_LOCATOR = (By.CLASS_NAME, "style-desc-item")
_profit_percent_LOCATOR = (By.CLASS_NAME, "profit-percent")
_style_name_LOCATOR = (By.CLASS_NAME,"style-name")
_style_description_LOCATOR = (By.CLASS_NAME, "style-description") def open_index_page(self,sso):
"""打开首页""" domain = "http://测试域名"
indexurl = '/index'
url = domain+ indexurl + '?' + sso
self.openpage(url)
self.getscreenshot("Indexpage打开页面") def get_styleList(self):
"""获取策略风格列表"""
styleList = self.getelements(*IndexPage._stylelist_LOCATOR) #策略列表
return styleList def get_current_style(self):
"""获取当前策略信息"""
current = self.getelement(*IndexPage._current_LOCATOR) #当前策略
self.current_style = current.get_attribute("data-style") #当前策略类型
self.current_name = current.text #当前策略名称 def choose_style(self,styleindex):
"""选择index = styleindex的策略风格"""
stylelist = self.get_styleList() #获取策略列表
try:
style = stylelist[styleindex]
self.select_style = style.get_attribute("data-style") # 选择的策略类型
self.select_name = style.text #选择的策略名称
style.click() #点击策略
self.wait(1)
self.getscreenshot("Indexpage策略信息")
self.get_current_style() #选择之后获取策略信息
except Exception as msg:
print(msg) def check_SelectEqCurrent(self):
"""验证选择的风格与显示的风格是否一致"""
if self.select_name == self.current_name and self.select_style == self.current_style:
return True def get_level_info_list(self):
"""获取右侧显示的策略信息列表"""
level_desc_items = self.getelements(*IndexPage._style_desc_item_LOCATOR) #取所有的策略详情
level_info_list = [item for item in level_desc_items if item.is_displayed()] #取页面显示的策略详情
return level_info_list def get_level_info(self,levelindex):
"""获取策略信息"""
levellist = self.get_level_info_list()
try:
level = levellist[levelindex] #获取策略信息
percentM3 = self.getchild(level,*IndexPage._profit_percent_LOCATOR)
name = self.getchild(level,*IndexPage._style_name_LOCATOR)
description = self.getchild(level,*IndexPage._style_description_LOCATOR)
read_strategy = self.getchild(level,*IndexPage._read_strategy_LOCATOR) self.percentM3 = float(percentM3.text[:-1])#获取3个月收益
self.name = name.text #策略名称
self.description = description.text #策略描述
self.read_strategy = read_strategy
self.data_code = self.read_strategy.get_attribute("data-code") # 策略代码
except Exception as msg:
print(msg) def get_mystyle(self):
"""获取我的风格"""
self.wait(0.5)
myStyle_nameele = self.getelement(*IndexPage._mystyle_name_LOCATOR)
self.myStyle_name = myStyle_nameele.text[1:-1] #我的风格 style_desc = self.getelement(*IndexPage._style_desc_LCOATOR)
self.movetoelement(style_desc) #移动鼠标至问号图标
myStyle_intips = self.getelement_wait_presence(*IndexPage._mystyle_name__LOCATOR)#等元素显示时识别
self.getscreenshot("Indexpage气泡")
self.myStylename_intips = myStyle_intips.text[:-1]
self.mystyle_remark = self.getelement(*IndexPage._myStyle_remark_LOCATOR).text #tip里的风格说明 def check_mystyle(self):
"""验证风险等级页面和tip是否一致"""
self.get_mystyle()
logging.info("用户类型:{0},tips里的用户类型:{1}".format(self.myStyle_name,self.myStylename_intips))
if self.myStyle_name == self.myStylename_intips and self.myStyle_name in self.mystyle_remark:
return True def check_default_ismystyle(self):
"""验证默认策略与用户风险等级匹配"""
self.refresh() #刷新,自动更新到用户匹配的等级
self.wait(1)
self.get_current_style()
self.get_mystyle()
logging.info("当前策略:{0},用户风格:{1}".format(self.current_name,self.myStyle_name))
if self.current_name == self.myStyle_name:
return True def clicklink_read_strategy(self,levelindex=0):
"""点击查看策略"""
self.get_level_info(levelindex) #选页面显示的第levelindex个策略
self.read_strategy.click() #点击查看策略
self.wait(1)
self.getscreenshot("Indexpage点击查看策略跳转到策略")
return self.driver,self.data_code #跳转到了策略页面
the end!
python UI自动化实战记录四:测试页面1-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自动化实战记录五:测试页面2 pageobject
该部分记录测试页面2-StrategyPage,所有页面2上的元素定位.操作.获取属性等方法都写在该类中. 1 页面2继承自BasePage: 2 页面2第一部分写的是所有的定位器 3 页面2第二部分 ...
- python UI自动化实战记录三:pageobject-基类
脚本思路: 使用pageobject模式,写一个basepage基类,所有页面的通用方法封装到基类中.比如打开页面,关闭页面,等待时间,鼠标移到元素上,获取单个元素,获取一组元素,获取元素的子元素,截 ...
- python UI自动化实战记录十一: 总结
首先说说为什么想起来用自动化脚本来实现该项目的自动化. 工作还是以手工测试为主,业务驱动型的项目大概就是这样,业务不停地变,不断的迭代. 自动化测试实施的先决条件: 一 得有时间. 如果有时间大部分的 ...
- 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 ...
随机推荐
- 使用YUM安装MySQL 5.5(适用于CentOS6.2/5.8及Fedora 17/16平台)
目前CentOS/Red Hat (RHEL) 6.2官方自带的mysql版本为5.1,mysql5.5已经出来了. 相比mysql5.1,mysql5.5不仅在多个方面进行了改进: 性能上有了很大提 ...
- 浅谈Java中的hashcode方法(转载)
哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: 1 public native int hashCode(); 根据 ...
- 创建WPF用户控件
wpf用户自定义控件和winform创建方法类似,这里先纠正一个误区,就是有很多人也是添加,然后新建,然后是新建用户控件库,但是为什么编译好生成后Debug目录下还是只有exe文件而没有dll文件呢? ...
- Nginx配置整理
不论是本地开发,还是远程到 Server 开发,还是给提供 demo 给人看效果,我们时常需要对 Nginx 做配置,Nginx 的配置项相当多,如果考虑性能配置起来会比较麻烦.不过,我们往往只是需要 ...
- ActiveMQ整合spring结合项目开发流程(生产者和消费者)总结
一:生产者代码编写: 1.配置pom.xml引入相关坐标 <dependencies> <!-- spring开发测试 --> <dependency> <g ...
- VirtualBox使用Centos7与主机共享文件夹
最近使用VitrtualBox安装Centos7学习,liunx脚本和一些命令,经过一些研究完成了虚拟机与 主机共享文件夹,虚拟机链接外部网络,主机与虚拟机互相通信.在其中遇到一些我解决的技术问题记录 ...
- hdu 4003 Find Metal Mineral 树形dp ,*****
Find Metal Mineral Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Other ...
- Jvm运行时内存解析
一.jvm的概念 在了解jvm的概念之前,我们先来了解java平台的逻辑结构,图片来自<深入java虚拟机> 从图中我们可以看到jdk包含了jre,java语言和java开发工具和Api, ...
- FWORK-数据存储篇 -- 范式与反模式 (学习和理解)
理解 1.第二范式的侧重点是非主键列是否完全依赖于主键,还是依赖于主键的一部分.第三范式的侧重点是非主键列是直接依赖于主键,还是直接依赖于非主键列. 2. 反模式 范式可以避免数据冗余,减少数据库的 ...
- IndexedDB(二:索引)
在HTML5本地存储--IndexedDB(一:基本使用)中介绍了关于IndexedDB的基本使用方法,很不过瘾,这篇我们来看看indexedDB的杀器--索引. 熟悉数据库的同学都知道索引的一个好处 ...