Python+Selenium WebUI自动化框架 -- 基础操作封装

news2024/11/28 14:31:46

前言:

封装Selenium基本操作,让所有页面操作一键调用,让UI自动化框架脱离高成本、低效率时代,将用例的重用性贯彻到极致,让烦人的PO模型变得无所谓,让一个测试小白都能编写并实现自动化。

知识储备前提:熟练python语言理论与实际运用,熟悉selenium库与自动化测试环境配置。

browseroperator.py   浏览器操作
webdriveroperator.py     WEBd页操作

分层设计:基础目录,浏览器操作与WEB操作分开。

一、browseroperator.py 的代码如下:

1、初始化函数def __init__(self),初始化浏览相关参数

2、初始化浏览器方法def open_url(self, **kwargs),先判断使用哪种浏览器。

**kwargs是不定长参数,dict格式,参数只需要传 url='www.baidu.com' ,方法调用只用 opr.open_url(url='www.baidu.com'),打开了浏览器,他会返回webdriver的句柄,调用处接收到全流程操作网站元素。

暂时还未封装IE 、火狐,留给各位朋友们实现吧,让我们一起学习

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:110685036【暗号:csdn999】

3、def close_browser(self, **kwargs)关闭浏览器,齐活,一并封装了

import os
import time
from selenium import webdriver
from common.getconf import Config
from common.getfiledir import BASEFACTORYDIR
 
 
class BrowserOperator(object):
 
    def __init__(self):
        self.conf = Config()
        self.driver_path = os.path.join(BASEFACTORYDIR, 'chromedriver.exe')
 
    def open_url(self, **kwargs):
        """
        打开网页
        :param url:
        :return: 返回 webdriver
        """
        try:
            url = kwargs['locator']
        except KeyError:
            return False, '没有URL参数'
        try:
            type = self.conf.get('base', 'browser_type')   #从配置文件里取浏览器的类型
            if type == 'chrome':
                #处理chrom弹出的info
                # chrome_options = webdriver.ChromeOptions()
                # #option.add_argument('disable-infobars')
                # chrome_options.add_experimental_option("excludeSwitches", ['enable-automation'])
                # self.driver = webdriver.Chrome(options=chrome_options, executable_path=self.driver_path)
                self.driver = webdriver.Chrome(executable_path=self.driver_path)
                self.driver.maximize_window()
                self.driver.get(url)
            elif type == 'IE':
                print('IE 浏览器')
            else:
                print('火狐浏览器')
        except Exception as e:
            return False, e
        return True, self.driver
 
 
 
 
    def close_browser(self, **kwargs):
        """
        关闭浏览器
        :return:
        """
        self.driver.quit()
        return True, '关闭浏览器成功'

二、webdriveroperator.py代码如下

1、def __init__(self, driver:Chrome),初始化浏览器返回的deriver句柄,

2、内容不一 一 介绍了,实现了所有页面的操作,定义成功与否判断、日志返回等细节。各位看官细细品尝,细节都在代码里,每个方法注释大体可以说明了这个方法意义,很容易看懂。

还有很多UI操作没有搬运上来,留给各位朋友们去实现吧,让我们一起学习

import os
import time
 
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver import Chrome
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from common.getfiledir import SCREENSHOTDIR
 
 
 
 
class WebdriverOperator(object):
 
    def __init__(self, driver:Chrome):
        self.driver = driver
 
    def get_screenshot_as_file(self):
        """
        截屏保存
        :return:返回路径
        """
        pic_name = str.split(str(time.time()), '.')[0] + str.split(str(time.time()), '.')[1] + '.png'
        screent_path = os.path.join(SCREENSHOTDIR, pic_name)
        self.driver.get_screenshot_as_file(screent_path)
        return screent_path
 
    def gotosleep(self, **kwargs):
        time.sleep(3)
        return True, '等待成功'
 
 
    def web_implicitly_wait(self, **kwargs):
        """
        隐式等待
        :return:
        type  存时间
        """
        try:
            s = kwargs['time']
        except KeyError:
            s = 10
        try:
            self.driver.implicitly_wait(s)
        except NoSuchElementException:
            return False, '隐式等待 页面元素未加载完成'
        return True, '隐式等待 元素加载完成'
 
 
    def web_element_wait(self, **kwargs):
        """
        等待元素可见
        :return:
        """
        try:
            type = kwargs['type']
            locator = kwargs['locator']
        except KeyError:
            return False, '未传需要等待元素的定位参数'
        try:
            s = kwargs['time']
        except KeyError:
            s = 30
        try:
            if type == 'id':
                WebDriverWait(self.driver, s, 0.5).until(EC.visibility_of_element_located((By.ID, locator)))
            elif type == 'name':
                WebDriverWait(self.driver, s, 0.5).until(EC.visibility_of_element_located((By.NAME, locator)))
            elif type == 'class':
                WebDriverWait(self.driver, s, 0.5).until(EC.visibility_of_element_located((By.CLASS_NAME, locator)))
            elif type == 'xpath':
                WebDriverWait(self.driver, s, 0.5).until(EC.visibility_of_element_located((By.XPATH, locator)))
            elif type == 'css':
                WebDriverWait(self.driver, s, 0.5).until(EC.visibility_of_element_located((By.CSS_SELECTOR, locator)))
            else:
                return False, '不能识别元素类型[' + type + ']'
        except NoSuchElementException:
            return False, '元素[' + locator + ']等待出现超时'
        return True, '元素[' + locator + ']等待出现成功'
 
 
    def find_element(self, type, locator, index = 0):
        """
        定位元素
        :param type:
        :param itor:
        :param index:
        :return:
        """
        #isinstance(self.driver, selenium.webdriver.Chrome.)
        type = str.lower(type)
        try:
            if type == 'id':
                elem = self.driver.find_elements_by_id(locator)[index]
            elif type == 'name':
                elem = self.driver.find_elements_by_name(locator)[index]
            elif type == 'class':
                elem = self.driver.find_elements_by_class_name(locator)[index]
            elif type == 'xpath':
                elem = self.driver.find_elements_by_xpath(locator)[index]
            elif type == 'css':
                elem = self.driver.find_elements_by_css_selector(locator)[index]
            else:
                return False, '不能识别元素类型:[' + type + ']'
        except Exception:
            screenshot_path = self.get_screenshot_as_file()
            return False, '获取[' + type + ']元素[' + locator + ']失败,已截图[' + screenshot_path + '].'
        return True, elem
 
 
    def element_click(self, **kwargs):
        """
        点击
        :param kwargs:
        :return:
        """
        try:
            type = kwargs['type']
            locator = kwargs['locator']
 
        except KeyError:
            return False, '缺少传参'
        try:
            index = kwargs['index']
        except KeyError:
            index = 0
        _isOK, _strLOG = self.find_element(type, locator, index)
        if not _isOK:      #元素没找到,返回失败结果
            return _isOK, _strLOG
        elem = _strLOG
        try:
            elem.click()
        except Exception:
            screenshot_path = self.get_screenshot_as_file()
            return False, '元素['+ locator +']点击失败,已截图[' + screenshot_path + '].'
        return True, '元素['+ locator +']点击成功'
 
 
    def element_input(self, **kwargs):
        """
        输入
        :param kwargs:
        :return:
        """
        try:
            type = kwargs['type']
            locator = kwargs['locator']
            text = str(kwargs['input'])
        except KeyError:
            return False, '缺少传参'
        try:
            index = kwargs['index']
        except KeyError:
            index = 0
        _isOK, _strLOG = self.find_element(type, locator, index)
        if not _isOK:  # 元素没找到,返回失败结果
            return _isOK, _strLOG
        elem = _strLOG
        # if 'test' != elem.get_property('type'):     #校验元素是不是text输入框
        #     screenshot_path = self.get_screenshot_as_file()
        #     return False, '元素['+ itor +']不是输入框,输入失败,已截图[' + screenshot_path + '].'
        try:
            elem.send_keys(text)
        except Exception:
            screenshot_path = self.get_screenshot_as_file()
            return False, '元素['+ locator +']输入['+ text +']失败,已截图[' + screenshot_path + '].'
        return True, '元素['+ locator +']输入['+ text +']成功'

结语:封装了基础类,还得实现一个工厂,实现统一一个入口执行所有自动化

点赞关注~~~

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走!

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
 

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1176988.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WordPress自适应图片主题源码CX-UDY主题模板 带会员积分下载系统

说明:该主题只适用于WordPress 4.8及以下版本,高版本暂不支持,介意的请勿下! 下载地址 qnziyw点cn/cmsmb/wordpress/8084点html

Flutter:安装依赖报错doesn‘t support null safety

项目中需要引用http依赖,在pubspec.yaml文件中添加如下信息: 当同步时,报错信息如下: [myflutter] flutter pub upgrade Resolving dependencies... The current Dart SDK version is 3.1.3. Because myflutter depends on http &…

超简单的Mac双开微信,升级后失败重复操作仍然有效

首先找到安装的微信 应用程序 -> 微信 右键 -> 复制 复制出来效果如下: 在复制出来的微信应用右键-> 点击显示包内容 但是每次打开微信都特别麻烦,这里选择脚本右键制作替身,最后多出来的替身图标,拖拽到桌面就可以了…

6.数据类型与运算符

目录 mysql数据类型 整型数据类型 浮点数类型和定点数类型 1、日期时间类型 1、YEAR 2、TIME 3、DATE类型 4、DATETIME 5、TIMESTAMP 2、字符串类型 1、CHAR 和 VARCHAR类型: 2、TEXT类型 3、ENUM类型 4、SET类型 二进制字符串类型 1、BIT类型 2、…

Java学习 7.Java-方法的使用

一、为什么要使用方法 在编程中,某段功能的代码可能频繁使用,如果在某个位置重新实现一遍,会: 1.使程序变得繁琐 2.开发效率底下,做了大量重复性工作 3.不利于维护,需要改动时,所有用到该段…

Flink SQL DataGen Connector 示例

Flink SQL DataGen Connector 示例 1、概述 使用 Flink SQL DataGen Connector,可以快速地生成符合规则的测试数据,可以在不依赖真实数据的情况下进行开发和测试。 2、使用示例 创建一个名为 “users” 的表,包含 6 个字段:id…

智能井盖生产商家,万宾科技井盖传感器产品详情

市政府管理水平决定城市人民幸福程度,所以在智慧城市推进过程中,市政府也在加快城市信息基础设施建设,希望提高公共服务水平,以此来满足城市居民的需求,进一步推进城市信息化智能化发展。作为城市生命线的一个组成部分…

Docker学习——④

文章目录 1、Docker Image(镜像)2、镜像命令详解2.1 docker rmi2.2 docker save2.3 docker load2.4 docker image inspect2.5 docker history2.6 docker image prune 3、镜像综合实战3.1 离线镜像迁移3.2 镜像存储的压缩与共享 1、Docker Image&#xff…

第七章《搞懂算法:线性回归是怎么回事》笔记

线性回归算法是机器学习算法中最简单的一类,线性回归算法主要用于连续值的预测问题。 7.1 什么是线性回归 这种刻画了不同变量之间关系的模型叫作回归模型,如果这个模型是线性的,则为线性回归模型。 线性回归主要是应用回归分析来确定两种…

webgoat-Path traversal

Path traversal 路径(目录)遍历是一种漏洞,攻击者能够访问或存储外部的文件和目录 应用程序运行的位置。这可能会导致从其他目录读取文件,如果是文件,则会导致读取文件 上传覆盖关键系统文件。 它是如何工作的&#…

京东数据分析:2023年9月京东打印机行业品牌销售排行榜

鲸参谋监测的京东平台9月份打印机市场销售数据已出炉! 鲸参谋数据显示,今年9月,京东平台打印机的销量为60万,环比增长约32%,同比下滑约25%;销售额为5亿,环比增长约35%,同比下滑约29%…

“掌握高效图片管理:轻松成为图像处理达人!“

您是否曾经为找不到合适的图片而烦恼?或者因为无法批量处理图片而感到困扰?现在,我们为您带来了一款全新的图像管理工具,让您轻松实现批量图片处理,变身为图像管理达人! 第一步,首先我们要进入首…

Windows桌面便签工具推荐使用哪一款?

电脑桌面上张贴便利贴可以将近期需要完成的工作计划逐一添加到便利贴中,电脑桌面悬挂便利贴工具可以督促日常各项事务的完成。当前可悬挂在电脑桌面上的便利贴工具是比较多的,其中桌面小工具便签软件敬业签可满足各行业的办公需求。 建议大家在Windows桌…

软件测试从0offer到20k,你只差银行测试这一步!!!

金融类软件测试 举个栗子,银行里的软件测试工程师。横向跟互联网公司里的测试来说,薪资相对稳定,加班少甚至基本没有,业务稳定。实在是测试类岗位中的香饽饽! 一、什么是金融行业 金融业是指经营金融商品的特殊行业&am…

【笔记】系统集成项目管理工程师-各管理输入输出整理

目录 一、整体管理 二、范围管理 三、进度管理 四、成本管理 五、质量管理 六、人力资源管理 七、干系人管理 八、风险管理 九、word 版本整理 十、PPT图版本管理 一、整体管理 1. 制订项目章程 2. 制订项目管理计划 3. 指导与管理项目工作 4. 监控项目工作 5. 实施…

好的FPGA编码风格(1)--尽量避免组合逻辑环路(Combinational Loops)

什么是组合逻辑环路? 组合逻辑环路(Combinational Loops):指组合逻辑的输出信号不经过任何时序逻辑电路(FF等),而直接反馈到输入节点,从而构成的电路环路。 此外,如果直接…

云计算的大模型之争,亚马逊云科技落后了?

文丨智能相对论 作者丨沈浪 “OpenAI使用了Azure的智能云服务”——在过去的半年,这几乎成为了微软智能云最好的广告词。 正所谓“水涨船高”,凭借OpenAI旗下的ChatGPT在全球范围内爆发,微软趁势拉了一波自家的云计算业务。2023年二季度&a…

SSL证书加密是什么?加密原理和过程是怎样的?

随着互联网的普及和发展,人们的日常生活与网络密切交织在一起。然而,由于网络通信的开放性,信息在传输过程中很容易被窃取、篡改或伪造,因此保护用户的隐私和数据安全显得尤为重要。SSL证书加密就是一种用于保护网络通信安全的技术…

代码随想录算法训练营第13天|239. 滑动窗口最大值 347. 前 K 个高频元素

239. 滑动窗口最大值 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1: 输入:nums [1,3,-…

多模态之ViLBERT:双流网络,各自为王

通篇读完这个论文,需要解决如下问题: ViLBERT架构是什么样子的?ViLBERT预训练任务是什么?ViLBERT实现细节有哪些? 我之前写了两个多模态基础的文章,没看过的同学可以先看看这两个文章: 分别是…