脚本思路:

  使用pageobject模式,写一个basepage基类,所有页面的通用方法封装到基类中。比如打开页面,关闭页面,等待时间,鼠标移到元素上,获取单个元素,获取一组元素,获取元素的子元素,截图等等。

  项目中的测试页面page1和page2都继承自basepage基类。可使用基类定义的方法。基类里会将webdriver和page合二为一,既将webdriver的操作改写成page的方法。

新建一个包pageclass 》 分别新建basepage、page1、page2三个python文件。

basepage里定义basepage基类,代码如下:

#-*-coding:utf-8-*-
"""
页面基类
所有页面通用的方法封装
dinghanhua
2019-01
""" from time import sleep
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver import ActionChainsimport os
from datetime import datetime class BasePage:
"""页面基类"""
def __init__(self,driver): #构造函数
self.driver = driver

def openpage(self,url):
""" 打开页面"""
self.driver.get(url)
self.driver.implicitly_wait(10) #隐式等待默认时间
self.driver.maximize_window() #最大化窗口

def getelement(self,*locator):
"""获取页面元素"""
return self.driver.find_element(*locator)

def getelements(self,*locator):
"""获取页面元素集"""
return self.driver.find_elements(*locator)

def getchild(self,pageelement,*locator):
"""获取页面子节点"""
return pageelement.find_element(*locator)

def getchilds(self,pageelement,*locator):
"""获取元素子节点集"""
return pageelement.find_elements(*locator)

def getelement_wait_presence(self,*locator):
ele = WebDriverWait(self.driver, 10, 0.2).until(
EC.presence_of_element_located(locator)
) # 等元素可定位时
return ele

def refresh(self):
"""刷新页面"""
self.driver.refresh()

def movetoelement(self,pageelement):
"""鼠标移到pageelement上"""
actionchains = ActionChains(self.driver)
actionchains.move_to_element(pageelement).perform() # 鼠标移到图标上

def wait(self,sec):
sleep(sec)

def getscreenshot(self,filename="截图"):
"""带有时间戳的截图"""
screenshot_dir = './screenshot' # 截图根目录
if not os.path.exists(screenshot_dir): #不存在则创建该目录
os.mkdir(screenshot_dir) nowdate = datetime.now().strftime('%Y%m%d') # 当日日期
screenshot_date_dir = os.path.join(screenshot_dir, str(nowdate)) # 当前日期文件夹
if not os.path.exists(screenshot_date_dir):
os.mkdir(screenshot_date_dir) # 不存在则创建 nowtime_ms = datetime.now().strftime('%H%M%S%f') # 时间戳到毫秒级
filename = nowtime_ms + filename + ".png" # 拼接文件名 时间戳+文件名+.png
filepath = os.path.join(screenshot_date_dir,filename)
self.driver.get_screenshot_as_file(filepath) # 截图

def closepage(self):
"""关闭浏览器"""
self.driver.quit()

如果page1或page2中有用到其他的webdriver方法,继续添加到basepage中。basepage的方法是逐渐增加的。可以适用于各个项目。

the end!

python UI自动化实战记录三:pageobject-基类的更多相关文章

  1. python UI自动化实战记录五:测试页面2 pageobject

    该部分记录测试页面2-StrategyPage,所有页面2上的元素定位.操作.获取属性等方法都写在该类中. 1 页面2继承自BasePage: 2 页面2第一部分写的是所有的定位器 3 页面2第二部分 ...

  2. python UI自动化实战记录二:请求接口数据并提取数据

    该部分记录如何获取预期结果-接口响应数据,分成两步: 1 获取数据源接口数据 2 提取后续页面对比中要用到的数据 并且为了便于后续调用,将接口相关的都封装到ProjectApi类中. 新建python ...

  3. python UI自动化实战记录六:页面1用例编写

    使用python自带的unittest测试框架,用例继承自unittest.TestCase类. 1 引入接口类和页面类 2 setUp函数中打开页面,定义接口对象 3 tearDown函数中关闭页面 ...

  4. python UI自动化实战记录一:测试需求与测试思路

    测试需求: 项目包含两个数据展示页面,数据均来自于四个数据源接口. 测试操作步骤: 选择5个大类型中的一个,每个大类型下有3个子类型,选择任一子类型,页面数据更新.需验证页面上的数据与数据源接口数据一 ...

  5. python UI自动化实战记录十一: 总结

    首先说说为什么想起来用自动化脚本来实现该项目的自动化. 工作还是以手工测试为主,业务驱动型的项目大概就是这样,业务不停地变,不断的迭代. 自动化测试实施的先决条件: 一 得有时间. 如果有时间大部分的 ...

  6. python UI自动化实战记录八:添加配置

    添加配置文件写入测试地址等,当环境切换时只需修改配置文件即可. 1 在项目目录下添加文件 config.ini 写入: [Domain] domain = http://test.domain.cn ...

  7. python UI自动化实战记录七:页面2用例编写

    使用python自带的unittest测试框架,用例继承自unittest.TestCase类. 1 引入接口类和页面类 2 setUp函数中打开页面,定义接口对象 3 tearDown函数中关闭页面 ...

  8. python UI自动化实战记录四:测试页面1-pageobject

    该部分记录测试页面1-IndexPage,所有首页上的元素定位.操作.获取属性等方法都写在该类中. 1 首页类继承自BasePage 2 首页类第一部分写的是所有的定位器 3 首页类第二部分类的方法, ...

  9. python UI自动化实战记录十:执行测试及测试报告

    使用简单的unittest.TextTestRunner. 思路: 1 在report目录下创建当日测试报告目录 20190113 2 创建测试报告文件 f = 时间戳.txt 3 加载测试集,运行测 ...

随机推荐

  1. AOP的最佳注入方式——MSIL注入

    下载PostSharp(Visual Studio Gallery). 安装一个AOP编译器和引入PostSharp.Aspects(注意安装过程中请使用免费的Express版本),然后初步演示代码: ...

  2. 九度oj 1464 Hello World for U 2012年浙江大学计算机及软件工程研究生机试真题

    题目1464:Hello World for U 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:3872 解决:1082 题目描述: Given any string of N (> ...

  3. Hibernate 多对多拆分 两个多对一

  4. <数据挖掘导论>读书笔记3--分类

    1.分类的基本概念 分类任务就是通过学习得到一个目标函数f,把每个属性集x映射到一个预先定义的类标号y 目标函数也称为分类模型. 2. 解决分类问题的一般方法: 决策树分类法 基于规则的分类法 神经网 ...

  5. MySQL之存储引擎(表类型)的选择

    和大部分的数据库不同,MySQL中有一个存储引擎的概念,用户可以根据数据存储的需求来选择不同的存储引擎.本次博客就来介绍一下MySQL中的存储引擎.MySQL版本 5.7.19. 概述 MySQL的存 ...

  6. SSH,SSM框架文件上传

    一.了解文件上传 1.1        什么是文件上传 将本地文件通过流的形式写到服务器上 1.2        文件上传的技术 JspSmartUpload: 其组件是应用jsp进行B/S程序开发过 ...

  7. Gradle sync failed: Cause: org.gradle.logging.StyledTextOutput$Style Consult IDE log for more details

    环境 Android studio 3.0 导入开源中国: ... dependencies { //noinspection GradleDependency classpath 'com.andr ...

  8. thinkphp注册并写入数据到数据库中

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. C 堆内存管理

    在Win32 程序中每个进程都占有4GB的虚拟地址空间,这4G的地址空间内部又被分为代码段,全局变量段堆段和栈段,栈内存由函数使用,用来存储函数内部的局部变量,而堆是由程序员自己申请与释放的,系统在管 ...

  10. webapi datetime类型序列化成json带T且时间不对问题的解决

    在global.asax.cs里加入如下代码: protected void Application_Start() { GlobalConfiguration.Configuration.Forma ...