python UI自动化实战记录三:pageobject-基类

脚本思路:使用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!

原文地址:https://www.cnblogs.com/dinghanhua/p/10263217.html

时间: 2024-11-09 05:26:29

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

python UI自动化实战记录五:测试页面2-策略页

该部分记录测试页面2-StrategyPage,所有首页上的元素定位.操作.获取属性等方法都写在该类中. 1 首页类继承自BasePage 2 首页类第一部分写的是所有的定位器 3 首页类第二部分类的方法,包括提取页面元素,页面元素的操作.获取属性.验证元素属性正确性等 4 当用例中需要用到该页面的某元素或操作时,补充方法到该类中,再在用例中调用 #coding:utf-8 """ 策略页面类 LOCATOR : 所有页面元素的定位器 策略页面元素的定位和操作均写在该类中 &

(appium+python)UI自动化_07_UI自动化实例【拼多多搜索商品为例】

前言 初学UI自动化的小伙伴,在配置好appium+python自动化环境后,往往不知道如何下手实现自动化.小编在初期学习的时候也有这种疑惑,在此以拼多多搜索为实例,展示下appium是如何实现自动化的. 前提:已安装配置好appium+python自动化环境 一.连接手机启动app 1,连接手机 -手机USB连接电脑 -手机打开开发者模式.USB调试功能 2,基础信息配置 基础连接信息如下(以微信app为例): 'platformName': 操作平台'deviceName': 设备名称'pl

Python 接口:从协议到抽象基类

抽象基类的常见用途:实现接口时作为超类使用.然后,说明抽象基类如何检查具体子类是否符合接口定义,以及如何使用注册机制声明一个类实现了某个接口,而不进行子类化操作.最后,说明如何让抽象基类自动“识别”任何符合接口的类——不进行子类化或注册. Python文化中的接口和协议 接口在动态类型语言中是怎么运作的呢?首先,基本的事实是,Python语言没有 interface 关键字,而且除了抽象基类,每个类都有接口:类实现或继承的公开属性(方法或数据属性),包括特殊方法,如__getitem__ 或 _

QWidget QMainWindow QDialog 三个基类的区别

Qt类是一个提供所需的像全局变量一样的大量不同的标识符的命名空间.通常情况下,你可以忽略这个类.QObject和一些其它类继承了它,所以在这个Qt命名空间中定义的所有标识符通常情况下都可以无限制的使用. QWidget类是所有用户界面对象的基类. 窗口部件是用户界面的一个原子:它从窗口系统接收鼠标.键盘和其它事件,并且在屏幕上绘制自己的表现.每一个窗口部件都是矩形,并且它们按Z轴顺序排列的.一个窗口部件可以被它的父窗口部件或者它前面的窗口部件盖住一部分. QMainWindow 类提供一个有菜单

制作可自定义风格的winform组件类(三)基类

一个良好的基类能决定这个控件能走多远,那么下面来定义一些事情. 定义状态,表示控件当前处于哪种状态,用来区别对同一事件作出不同的响应 [Flags] public enum CDControlState { None = 0, SkinLoaded = 1, MouseEnter = 2, MouseDown = 4, Resizing = 8, } 定义事件,用来定制需求,忽略无用的代码,以免造成过多响应或是窗口重绘 [Flags] public enum CDControlEvent { N

Java记录 -22- Java的基类Object详解

Java的基类Object详解 Java的JDK文档要经常查阅使用,最好查看英文的文档. java.lang.Object 类,java.lang包在使用的时候无需显示导入,编译时由编译器自动帮助我们导入. API(Application Programinga Interface),应用编程接口. Object obj = new Object(); System.out.println(obj); System.out.println(obj.toString()); 上面打印的两个内容一样

(appium+python)UI自动化_10_adb常用命令

前言 adb(Android Debug Bridge)工具是android-sdk里的一个工具,是一个命令行窗口,用于通过电脑端与模拟器或者真实设备交互.在app自动化测试过程中,有时要用到adb命令,但是每次都要百度感觉很是繁琐,故总结了下app自动化过程中几个常用的adb命令. adb常用命令 获取设备号 $ adb devices  下载apk 前提:需下载apk至电脑 $ adb install <电脑apk路径> 卸载apk $ adb uninstall <apk包名>

python UI自动化之js操作

js处理iframe无需先切换到iframe上,再切回来操作.它可以在iframe上和主页面上来回自由操作. switch方法需要先切换到iframe上,操作完之后又的切换回来(很容易忘记切换回来),操作比较繁琐. 1.js处理富文本(富文本格式如禅道中的添加bug页面) 带iframe的元素,用js去操作contentWindow(相当于切换到iframe) body = "这里是通过js发的正文内容" # js处理iframe问题(js代码太长了,我分成两行了) js = 'doc

MP实战系列(三)之实体类讲解

首先说一句,mybatis plus实在太好用了! mybaits plus的实体类: 以我博客的用户类作为讲解 package com.blog.entity; import com.baomidou.mybatisplus.annotations.TableField; import com.baomidou.mybatisplus.annotations.TableId; import com.baomidou.mybatisplus.annotations.TableLogic; imp