关键字封装

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Name: basepage
# Author: 简
# Time: 2019/6/18

from app_framework.Common import log

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

import datetime
import time

from app_framework.Common.contants import screenshot_dir
logger=log.get_logger(__name__)

class BasePage:

    # 包含了PageObjects当中,用到所有的selenium底层方法。
    # 还可以包含通用的一些元素操作,如alert,iframe,windows...
    # 还可以自己额外封装一些web相关的断言
    # 实现日志记录、实现失败截图

    def __init__(self,driver):
        self.driver = driver

    def wait_eleVisible(self,loc,img_doc="",timeout=30,frequency=0.5):
        logger.info("等待元素 {} 可见。".format(loc))
        try:
            # 起始等待的时间 datetime
            start = datetime.datetime.now()
            WebDriverWait(self.driver,timeout,frequency).until(EC.visibility_of_element_located(loc))
            # 结束等待的时间
            end = datetime.datetime.now()
            logger.info("开始等待时间点:{},结束等待时间点:{},等待时长为:{}".
                format(start,end,end-start))
        except:
            # 日志
            logger.exception("等待元素可见失败:")
            # 截图 - 哪一个页面哪一个操作导致的失败。+ 当前时间
            self.save_web_screenshot(img_doc)
            raise
    #获取toast等待用
    def wait_elePresence(self,loc,img_doc="",timeout=30,frequency=0.5):
        logger.info("等待元素 {} 可见。".format(loc))
        try:
            # 起始等待的时间 datetime
            start = datetime.datetime.now()
            WebDriverWait(self.driver,timeout,frequency).until(EC.presence_of_element_located(loc))
            # 结束等待的时间
            end = datetime.datetime.now()
            logger.info("开始等待时间点:{},结束等待时间点:{},等待时长为:{}".
                format(start,end,end-start))
        except:
            # 日志
            logger.exception("等待元素可见失败:")
            # 截图 - 哪一个页面哪一个操作导致的失败。+ 当前时间
            self.save_web_screenshot(img_doc)
            raise

    # 查找一个元素
    def get_element(self,loc,img_doc=""):
        """
        :param loc: 元素定位。以元组的形式。(定位类型、定位时间)
        :param img_doc: 截图的说明。例如:登陆页面_输入用户名
        :return: WebElement对象。
        """
        logger.info("查找 {} 中的元素 {} ".format(img_doc,loc))
        try:
            ele = self.driver.find_element(*loc)
            return ele
        except:
            # 日志
            logger.exception("查找元素失败")
            # 截图
            self.save_web_screenshot(img_doc)
            raise

    def click_element(self,loc,img_doc,timeout=30,frequency=0.5):
        """
        实现了,等待元素可见,找元素,然后再去点击元素。
        :param loc:
        :param img_doc:
        :return:
        """
        # 1、等待元素可见
        self.wait_eleVisible(loc,img_doc,timeout,frequency)
        # 2、找元素
        ele = self.get_element(loc,img_doc)
        # 3、再操作
        logger.info(" 点击元素 {}".format(loc))
        try:
            ele.click()
        except:
            # 日志
            logger.exception("点击元素失败")
            # 截图
            self.save_web_screenshot(img_doc)
            raise

    # 文本输入
    def input_text(self,loc,img_doc,*args):
        # 1、等待元素可见
        self.wait_eleVisible(loc,img_doc)
        # 2、找元素
        ele = self.get_element(loc,img_doc)
        # 3、再操作
        logger.info(" 给元素 {} 输入文本内容:{}".format(loc,args))
        try:
            ele.send_keys(*args)
        except:
            # 日志
            logger.exception("元素输入操作失败")
            # 截图
            self.save_web_screenshot(img_doc)
            raise

    # 获取元素的属性值
    def get_element_attribute(self,loc,attr_name,img_doc,timeout=30,frequency=0.5):
        # 等待元素存在 、sleep(1)
        self.wait_elePresence(loc,img_doc,timeout,frequency)
        # time.sleep(0.1)
        # 获取元素
        ele = self.get_element(loc,img_doc)
        # 获取属性
        try:
            attr_value =  ele.get_attribute(attr_name)
            logger.info("获取元素 {} 的属性 {} 值为:{}".format(loc, attr_name,attr_value))
            return attr_value
        except:
            # 日志
            logger.exception("获取元素属性失败")
            # 截图
            self.save_web_screenshot(img_doc)
            raise

    # 获取元素的文本值。
    def get_element_text(self,loc,img_doc,timeout=30,frequency=0.5):
        # 等待元素存在 、sleep(1)
        self.wait_elePresence(loc, img_doc, timeout, frequency)
        ele = self.get_element(loc, img_doc)
        # 获取属性
        try:
            text = ele.text
            logger.info("获取元素 {} 的文件值为:{}".format(loc, text))
            return text
        except:
            # 日志
            logger.exception("获取元素文本值失败")
            # 截图
            self.save_web_screenshot(img_doc)
            raise

    # 实现网页截图操作
    def save_web_screenshot(self,img_doc):
        #  页面_功能_时间.png
        now = time.strftime("%Y-%m-%d %H_%M_%S")
        filepath = "{}_{}.png".format(img_doc,now)
        try:
            self.driver.save_screenshot(screenshot_dir +"/" + filepath)
            logger.info("网页截图成功。图片存储在:{}".format(screenshot_dir +"/" + filepath))
        except:
            logger.exception("网页截屏失败!")
    #切换app
    def check_app(self,appPackage=None,appActivity=None):
        self.driver.start_activity(appPackage,appActivity)

# 获取窗口的大小
    def get_window(self):
        size = self.driver.get_window_size()
        logger.info("获取窗口大小成功")
        return size

# 上下左右滑动 - up  down  left right
    def swipe(self,fangxiang=None,):
        size=self.get_window()
        self.fangxiang=fangxiang
        if fangxiang ==‘up‘: #从下往上
            self.driver.swipe(size["width"] * 0.9, size["height"] * 0.5, size["width"] * 0.1, size["height"] * 0.1)
            logger.info(‘往上滑动‘)
        elif fangxiang ==‘down‘:#从上往下
            self.driver.swipe(size["width"] * 0.9, size["height"] * 0.1, size["width"] * 0.1, size["height"] * 0.5)
            logger.info(‘往下滑动‘)
        elif fangxiang ==‘left‘:#从右往左
            logger.info(‘往左滑动‘)
            self.driver.swipe(size["width"]*0.9,size["height"]*0.5,size["width"]*0.1,size["height"]*0.5)
        else:#从左往右
            logger.info(‘往右滑动‘)
            self.driver.swipe(size["width"]*0.1,size["height"]*0.5,size["width"]*0.9,size["height"]*0.5)
    # toast获取
    def get_toast(self,loc,img_doc,timeout=30,frequency=0.5):
        try:
            self.wait_elePresence(loc,img_doc,timeout,frequency)
            logger.info(‘toast提示是,{}‘.format(self.driver.find_element_by_xpath(loc).text))
            return self.driver.find_element_by_xpath(loc).text
        except:
                logger.exception("没有获取 到toast信息!")
                self.save_web_screenshot(img_doc)

# 切换到webview - context
# 获取当前的contexts

# 获取元素的大小和位置

if __name__ == ‘__main__‘:
    BasePage(driver=1).swipe(fangxiang=‘up‘)

原文地址:https://www.cnblogs.com/minghong/p/11479341.html

时间: 2024-11-06 09:35:15

关键字封装的相关文章

转:C#中Monitor对象与Lock关键字的区别分析

Monitor对象1.Monitor.Enter(object)方法是获取 锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取锁之后因为异常,致锁 无法释放,所以需要在try{} catch(){}之后的finally{}结构体中释放锁(Monitor.Exit()).2.Monitor的常用属性和方法: Enter(Object) 在指定对象上获取排他锁. Exit(Object) 释放指定对象上的排他锁. IsEnte

C#中Monitor对象与Lock关键字的区别分析

这篇文章主要介绍了C#中Monitor对象与Lock关键字的区别,需要的朋友可以参考下 Monitor对象 1.Monitor.Enter(object)方法是获取 锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取锁之后因为异常,致锁 无法释放,所以需要在try{} catch(){}之后的finally{}结构体中释放锁(Monitor.Exit()).2.Monitor的常用属性和方法: Enter(Object)

PHP面向对象(二)

一.概念 封装性是面向对象编程中的三大特性之一,封装就是把对象中的成员属性和成员方法加上访问修饰符,使其尽可能隐藏对象的内部细节,以达到对成员的访问控制(切记不是拒绝访问). 含义: a.把对象的全部成员属性和全部成员方法结合在一起,形成一个不可分割的独立单位(即对象) b.信息隐蔽,即尽可能隐蔽对象的内部细节,对外形成一个边界(或者说形成一道屏障),只保留有限的对外接口使之与外部发生联系. 原则:要求对象以外的部分不能随意存取对象的内部数据(成员属性和成员方法),从而有效的避免了外部错  误对

python作为一种胶水和c/c++

如果需要用 Python 调用 C/C++ 编写的第三方库,只需要一个脚本语言来粘合它们.这个时候,用 Python ctypes 可以很方便地实现调用. StackOverflow 上的 Calling C/C++ from python 这个主题介绍了 ctypes 最简单的入门方法,概括如下: 如果是 C 函数库,则直接 load 这个库,然后调用即可: 如果是 C++ 函数库,则需要用 extern 关键字封装一个供 C 使用的函数,即把类隐藏到一些 C 风格的函数里,然后用 exter

Robot Framework之测试用例分层实战

1.1  测试用例的第一层(交互层) 1. 创建项目资源(Resource). 操作步骤: 点”项目名称”->右键,选New Resource,在弹窗Name 输入框输入资源名称 mykeywork->新建项目资源. 2.给新建的项目资源导入Selenium2Library库. 3.创建自定义关键字(New User Keyword). 操作步骤: 点”项目资源”->右键,选New User Keyword,在弹窗Name 输入框输入资源名称 打开浏览器->新建用户关键字. 4.给

java之面向对象(一)

主要知识点: 什么叫面向对象 类 构造方法 static与类的加载顺序 匿名对象 this关键字 封装 访问权限修饰符 类的设计分析 继承 子类访问父类和方法覆写 super关键字 多态 引用变量类型转换 什么叫面向对象 面向对象:把数据和对数据的操作方法放在一起,作为一个相互依存的整体——对象.对同类对象抽象出其共性,形成类.类中的大多数数据,只能用本类的方法进行处理.类通过一个简单的外部接口与外界发生关系,对象与对象之间通过信息进行通信.程序流程由用户在使用中决定.面向过程:自顶向下顺序执行

Robot Framework + Selenium2Library环境下,结合Selenium Grid实施分布式自动化测试

最近一段时间,公司在推行自动化测试流程,本人有幸参与了自定义通用控件的关键字封装和脚本辅助编写.数据驱动管理.测试用例执行管理等一系列工具软件的研发工作,积累了一些经验,在此与大家做一下分享,也算是做一个总结吧,希望能给大家带来启发和帮助.由于业界没有成熟的解决方案可供参考,本人在研究过程中也是摸着石头过河,纰漏之处在所难免,如果大家有更好的方案,敬请不吝赐教. 分布式并行执行用例需求背景 公司的产品属于web app,采用的是Robot Framework + Selenium2Library

Python编程_Selenium2Library源码分析

[Package] keywords 所有关键字封装 [Class] _waiting.py 等待函数的条件判断, 替换sleep, 在依次以条件逻辑执行较多用例时可以有效节省执行等待时间, 快速定位问题 _wait_until(self, timeout, error, function, *args) 概述: 直到function(*args)为True时return None, 为False则return error, 超时时间timeout 参数: error: 初始化为超时异常 fun

RFS的常用思路

简单的做个记录: 1. 基本框架的搭建: - 一个层用于页面控件的关键字封装(比如表单控件的处理,列表的处理等) - 一个层用于系统常用功能操作的封装(立足于整个系统的,比如登陆,查询,业务参数,文件的上传下载等) - 一个层用于系统的自动化用例实现 如图: