seleuium 自动测试工具

seleuium 自动测试工具

基础操作对象
import time
from selenium import webdriver
from selenium.webdriver.chrome.webdriver import WebDriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWaitfrom pages.Login import Login
from pages.config import configclass BasePage:_baseurl = 'https://ipark-sit.bgy.com.cn/welcome'def __init__(self, driver=None, op=1):self._baseurl = config.get("home-page")"""初始化启动浏览器:param driver: 解决继承的子类重复初始化打开浏览器问题:param op: 0为复用流量器启动driver,1为打开新的浏览器复用旧的cookie"""if driver is None:if op == 0:self.driver = self.options_chrome()elif op == 1:self.driver = self.cookie_chrome()else:self.driver: WebDriver = drivertime.sleep(1)  # 新打开一个页面强制等待3秒Login().login(self.driver)  # 将登录后的cookie写进cookie.yml# Login().set_login_cookie(self.driver.get_cookies())  # 将登录后的cookie写进cookie.ymlself.driver.implicitly_wait(10)  # 设置隐式断言10秒def options_chrome(self):"""复用浏览器"""chrome_options = webdriver.ChromeOptions()chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")self.driver = webdriver.Chrome(options=chrome_options)self.driver.get(self._baseurl)return self.driverdef cookie_chrome(self):"""读取cookie复用登录状态"""self.driver = webdriver.Chrome()self.driver.get(self._baseurl)  # 打开首页cookie = Login().get_login_cookie()if cookie is not None:cookies = self.driver.get_cookies()print(cookies)for e in cookie:print(e)self.driver.add_cookie(e)  # 将cookie添加到打开的浏览器中# self.driver.refresh()  # 刷新浏览器return self.driverdef my_locator(self, by, locator=None):"""封装元素为止传参,使可兼容多种传参:param by: css,id,xpath,class_name,link_text,partial_link_text,tag_name:param locator::return:"""if locator is None:by, value = by[0], by[1]else:by, value = by, locatorif by.upper() == 'CSS':by = By.CSS_SELECTORelif by.upper() == 'ID':by = By.IDelif by.upper() == 'XPATH':by = By.XPATHelif by.upper() == 'CLASS_NAME':by = By.CLASS_NAMEelif by.upper() == 'LINK_TEXT':by = By.LINK_TEXTelif by.upper() == 'PARTIAL_LINK_TEXT':by = By.PARTIAL_LINK_TEXTelif by.upper() == 'TAG_NAME':by = By.TAG_NAMEelse:by = byreturn by, valuedef find_ele(self, by, locator=None):"""查找元素,支持传(By.type, value),也支持传入By.type, value;:param by: css,id,xpath,class_name,link_text,partial_link_text,tag_name:param locator::return:"""if locator is None:by, value = by[0], by[1]else:by, value = by, locatorif by.upper() == 'CSS':by = By.CSS_SELECTORelif by.upper() == 'ID':by = By.IDelif by.upper() == 'XPATH':by = By.XPATHelif by.upper() == 'CLASS_NAME':by = By.CLASS_NAMEelif by.upper() == 'LINK_TEXT':by = By.LINK_TEXTelif by.upper() == 'PARTIAL_LINK_TEXT':by = By.PARTIAL_LINK_TEXTelif by.upper() == 'TAG_NAME':by = By.TAG_NAMEelse:by = byself.wait_clickable(by, value)return self.driver.find_element(by, value)def find_ele_list(self, by, locator=None):"""查找元素,支持传(By.type, value),也支持传入By.type, value;:param by: css,id,xpath,class_name,link_text,partial_link_text,tag_name:param locator::return:"""if locator is None:by, value = by[0], by[1]else:by, value = by, locatorif by.upper() == 'CSS':by = By.CSS_SELECTORelif by.upper() == 'ID':by = By.IDelif by.upper() == 'XPATH':by = By.XPATHelif by.upper() == 'CLASS_NAME':by = By.CLASS_NAMEelif by.upper() == 'LINK_TEXT':by = By.LINK_TEXTelif by.upper() == 'PARTIAL_LINK_TEXT':by = By.PARTIAL_LINK_TEXTelif by.upper() == 'TAG_NAME':by = By.TAG_NAMEelse:by = byreturn self.driver.find_elements(by, value)def wait_clickable(self, by, locator=None, time=30):"""显式等待:param by:css,id,xpath,class_name,link_text,partial_link_text,tag_name:param locator: 等待元素可点击为止,这里需要传入元素的locator:param time: 等待时间:return:"""WebDriverWait(self.driver, time).until(expected_conditions.element_to_be_clickable(self.my_locator(by, locator)))def wait_visibility(self, by, locator=None, time=30):"""显式等待:param by: css,id,xpath,class_name,link_text,partial_link_text,tag_name:param locator: 等待元素可见为止,这里需要传入元素的locator:param time: 等待时间:return:"""WebDriverWait(self.driver, time).until(expected_conditions.visibility_of_element_located(self.my_locator(by, locator)))def ele_click(self, by, locator=None):"""点击元素,支持传(By.type, value),也支持传入By.type, value;:param by: css,id,xpath,class_name,link_text,partial_link_text,tag_name:param locator::return:"""self.find_ele(by, locator=locator).click()@propertydef baseurl(self):return self._baseurl
登录页处理
import timefrom selenium.webdriver.common.by import Byfrom pages.OperationYaml import OperationYaml
from pages.config import config_COOKIEYMAL = '../file/cookie.yml'  # 用来放登录后获取的cookieclass Login:def login(self, driver):driver.find_element(By.XPATH, "//div[@id='root']/div/div[2]/div[2]/div/img").click()time.sleep(1)  # 新打开一个页面强制等待3秒username = driver.find_element(By.ID, "j_username")username.clear()username.send_keys(config.get("username"))passwd = driver.find_element(By.ID, "j_password")passwd.clear()print(config.get("passwd"))passwd.send_keys(config.get("passwd"))driver.find_element(By.CLASS_NAME, "loginBt").click()"""处理cookie使免登陆"""def get_login_cookie(self):"""读取yaml文件,将cookie读取出来"""cookie = OperationYaml().get_yaml(_COOKIEYMAL)if isinstance(cookie, list):cookies_list = cookieelse:cookies_list = self.str_to_list(cookie)return cookies_listdef set_login_cookie(self, cookies):"""往yaml文件中写入cookie"""if isinstance(cookies, list):cookies_list = cookieselse:cookies_list = self.str_to_list(cookies)OperationYaml().set_w_yaml(cookies_list, _COOKIEYMAL)def str_to_list(self, cookies):"""将文本的cookie进行处理,返回的是一个列表"""if cookies is not None:l_list = cookies.split('; ')cookies_list = []for i in l_list:key, value = i.split('=', 1)cookie = {'domain': '.bgy.com.cn', 'name': key, 'path': '/', 'value': value}cookies_list.append(cookie)return cookies_listelse:return None
主方法运行
import logging
import timefrom selenium.webdriver import ActionChains
from selenium.webdriver.common.by import Byfrom pages.BasePage import BasePageclass Runner:def __init__(self):self.BasePage = BasePage()self.driver = self.BasePage.driverself.baseurl = self.BasePage.baseurldef runner(self, data):"""执行步骤:param data: dict:return:"""# 1.点击我的空间# pro_list = self.driver.find_elements_by_css_selector("ant-menu-overflow-item ant-menu-item "#                                                      "ant-menu-item-selected ant-menu-item-only-child")# 2.依次点击每个项目,然后点击生成pro_list = self.driver.find_elements(By.XPATH, "//div[@class='ant-spin-container']/div/div[2]/div")pl_idx = 2while pl_idx < len(pro_list):pl = pro_list[pl_idx]pl.click()time.sleep(1)self.driver.find_element(By.XPATH, "//div[@class='ant-spin-container']/div/div[2]/div[2]/div").click()time.sleep(1)self.driver.find_elements(By.CLASS_NAME, "ant-menu-item")[1].click()time.sleep(2)self.driver.find_elements(By.CLASS_NAME, "ant-menu-item")[2].click()confirm = self.driver.find_element(By.XPATH, "//div[@class='ant-modal-confirm-btns']/button[2]")# 点击不能直接用click,否则没有用if confirm:self.driver.execute_script("arguments[0].click();", confirm)# ActionChains(self.driver).move_to_element(confirm).click().perform()  # 使用鼠标点击的方式time.sleep(3)self.driver.find_elements(By.CLASS_NAME, "ant-menu-item")[3].click()time.sleep(1)self.driver.find_elements(By.CLASS_NAME, "ant-menu-overflow-item")[0].click()time.sleep(2)pro_list = self.driver.find_elements(By.XPATH, "//div[@class='ant-spin-container']/div/div[2]/div")pl_idx += 1logging.info("执行完成....")if __name__ == "__main__":data = {"action": "click", "by": "xx"}Runner().runner(data)
读取配置
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date    : 2021-09-06 17:48:59
# @Author  : wangmian05
# @Link    : wangmian05@countrygraden.com.cn
# @Version : $Id$
import base64
import os
import syssys.path.append("..")import logger as logconfig = {}def start_with(cont, param):cont = cont.lstrip()if param in cont and (cont.index(param) == 0 or cont.index(param) == 1):return Truereturn Falseenv = sys.argv[1] if len(sys.argv) > 1 else None
service_port = sys.argv[2] if len(sys.argv) > 2 else 0log.debug("current env:{},service_port:{}", env, service_port)env_prefix = env if env and len(env) > 0 else "sit"log.debug("profile:{}", env_prefix)
current_path = os.path.abspath(__file__)father_path = os.path.abspath(os.path.dirname(current_path) + os.path.sep + ".")ph = str(father_path)
pwd = ph if ph.rindex("keyword") == 0 else ph[0:(ph.index("keyword") + len("keyword"))]
case_file_path = pwd + "/server-" + env_prefix + ".conf"
with open(case_file_path, "rb") as fs:for f in fs:content = f.decode('utf-8').replace("\r", '').replace("\n", '')if len(content) == 0 or start_with(content, "#"):continuect_idx = content.index("=")isp = [content[0:ct_idx], content[ct_idx + 1:]]dbc = isp[1]if isp[0] == "passwd":encrypt_code = base64.decodebytes(dbc[1:len(dbc) - 1].encode("utf-8"))isp[1] = "".join((list(encrypt_code.decode())[::-1])[0:len(list(encrypt_code.decode())) - 6])config[isp[0]] = isp[1]if __name__ == "__main__":str = "pass.passwd"dy = Nonemiwen = base64.encodebytes("".join(list(str)[::-1]).encode("utf-8"))print(miwen.decode())

##### 配置文件

# server 配置项
home-page=https://xx.com.cn/welcome/
username=user
passwd='ZHdzc2FwZHJvd3NzYXA='
必要依赖处理
async-generator==1.10
atomicwrites==1.4.0
attrs==21.3.0
certifi==2021.10.8
cffi==1.15.0
colorama==0.4.4
cryptography==36.0.1
et-xmlfile==1.1.0
h11==0.12.0
idna==3.3
iniconfig==1.1.1
openpyxl==3.0.9
outcome==1.1.0
packaging==21.3
pluggy==1.0.0
py==1.11.0
pycparser==2.21
pyOpenSSL==21.0.0
pyparsing==3.0.6
pytest==6.2.5
PyYAML==6.0
selenium==4.1.0
six==1.16.0
sniffio==1.2.0
sortedcontainers==2.4.0
toml==0.10.2
trio==0.19.0
trio-websocket==0.9.2
urllib3==1.26.7
wsproto==1.0.0

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

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

相关文章

L1-033 出生年 c++解法

一、题目再现 以上是新浪微博中一奇葩贴&#xff1a;“我出生于1988年&#xff0c;直到25岁才遇到4个数字都不相同的年份。”也就是说&#xff0c;直到2013年才达到“4个数字都不相同”的要求。本题请你根据要求&#xff0c;自动填充“我出生于y年&#xff0c;直到x岁才遇到n个…

增强for循环和一般for循环的对比使用

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。个人B站主页热爱技术的小郑 &#xff0c;视频内容主要是对应文章的视频讲解形式。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘…

Vue watch实时计算器

watch实时计算器 可以自己选择、-、*、 参考代码 <!DOCTYPE html> <html> <head><meta charset"utf-8"><title></title><script src"https://cdn.bootcdn.net/ajax/libs/vue/2.7.10/vue.js"></script>…

Vue computed计算属性购物车实例

效果演示 对于computed的计算属性可以通过这个购物车例子来了解&#xff0c;笔者最近很是疲累&#xff0c;真的不想过多解释了&#xff0c;还请读者自行看代码研究。 参考代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"U…

【蓝桥杯选拔赛真题62】Scratch判断小球 少儿编程scratch图形化编程 蓝桥杯选拔赛真题解析

目录 scratch判断小球 一、题目要求 编程实现 二、案例分析 1、角色分析

第十四届蓝桥杯大赛软件赛决赛 C/C++ 大学 B 组 试题 B: 双子数

[蓝桥杯 2023 国 B] 双子数 试题 B: 双子数 【问题描述】 若一个正整数 x x x 可以被表示为 p 2 q 2 p^2 \times q^2 p2q2&#xff0c;其中 p p p、 q q q 为质数且 p ≠ q p \neq q pq&#xff0c;则 x x x 是 一个 “双子数”。请计算区间 [ 2333 , 233333333333…

API接口自动化测试框架

前言 接口自动化逐渐成为各大公司投入产出最高的测试技术。但是如何在版本迅速迭代过程中提高接口自动化的测试效率&#xff0c;仍然是大部分公司需要解决的问题。 框架定位 数据驱动设计模式&#xff0c;无需写测试代码脚本即可实现自动化等价类非等价类覆盖&#xff0c; E2E…

数组01-二分查找算法

目录 数组如何实现随机访问 两个关键词 数组的特点 根据下标随机访问数组元素 为什么数组要从0开始编号&#xff0c;而不是从1开始 LeetCode之路——704. 二分查找 Code 二分查找算法 数组如何实现随机访问 数组&#xff08;Array&#xff09;是一种线性表数据结构。它…

C语言——运算符

C用运算符表示算术运算。 C没有指数运算符&#xff0c;不过&#xff0c;C的标准数学库提供了一个pow()函数用于指数运算。 基本运算符 赋值运算符&#xff1a; 变量名变量值 从右到左 左值和变量名的区别&#xff1a; 变量名是一个标识符的名称&#xff0c;左值是一个可变…

利用EasyX图形库实现趣味化编程note1

学习太久枯燥乏味&#xff1f;学习完Easyx图形库&#xff0c;创造无限可能。 首先来讲一下什么是图形库&#xff0c;图形库在屏幕上渲染图像的程序库&#xff0c;为我们提供了一组函数进行渲染&#xff0c;常见的图形库有QT,GTK,Windows GDI&#xff0c;著名的WPS就是用QT图形库…

视频汇聚/安防监控平台EasyCVR指定到新的硬盘进行存储录像,如何自动挂载该磁盘?

TSINGSEE青犀视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力&…

多线程的死锁问题

可重入和不可重入&#x1f60a;&#x1f60a;&#x1f60a; 一个线程针对同一个对象,连续加锁两次,是否会有问题 ~~ 如果没问题,就叫可重入的.如果有问题,就叫不可重入的. 代码示例&#x1f349;&#x1f349;&#x1f349;: synchronized public void add(){synchronized (…

大模型助力企业数据驱动,火山引擎数智平台发布AI助手

9月19日&#xff0c;火山引擎在其举办的“V-Tech数据驱动科技峰会”上宣布&#xff0c;火山引擎数智平台VeDI推出“AI助手”&#xff0c;通过接入人工智能大模型&#xff0c;帮助企业提升数据处理和查询分析的效率。即使是不会写代码的运营人员&#xff0c;和大模型对话也能做好…

【CNN-FPGA开源项目解析】卷积层03--单格乘加运算单元PE 单窗口卷积块CU 模块

03–单格乘加运算单元PE & 单窗口卷积块CU 文章目录 03--单格乘加运算单元PE & 单窗口卷积块CU前言单格乘加运算单元PE代码模块结构时序逻辑分析对其上层模块CU的要求 单窗口卷积块CU代码逻辑分析 前言 ​ 第一和第二篇日志已经详细阐述了"半精度浮点数"的加…

贪心算法-

代码随想录 什么是贪心 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 这么说有点抽象&#xff0c;来举一个例子&#xff1a; 例如&#xff0c;有一堆钞票&#xff0c;你可以拿走十张&#xff0c;如果想达到最大的金额&#xff0c;你要怎么拿&#xff…

通过 HelpLook ChatBot AI自动问答机器人降低客户服务成本

在当今竞争激烈的商业环境中&#xff0c;提供卓越的客户服务对于维持忠诚的客户群和推动业务增长至关重要。客户服务涵盖了公司与其客户之间的所有互动&#xff0c;包括解答问题、解决问题和提供支持。它在塑造客户对品牌的看法方面起着关键作用&#xff0c;并且可以显著影响他…

如何通过bat批处理实现快速生成文件目录,一键生成文件名和文件夹名目录

碰对了情人&#xff0c;相思一辈子。 具体方法步骤&#xff1a; 一、创建一个执行bat文件&#xff08;使用记事本即可&#xff09;&#xff1b; 1、新建一个txt文本空白记事本文件 2、复制以下内容进记事本内 dir/a/s/b>LIST.TXT &#xff08;其中LIST.TXT文件名是提取后将…

【微服务】spring 控制bean加载顺序使用详解

目录 一、前言 二、使用order注解控制顺序 2.1 order 注解使用示例 2.2 order注解顺序失效问题 2.2.1 order失效问题解决办法 2.3 实现Ordered接口 三、使用dependon注解控制顺序 四、AutoConfiguration注解控制bean加载顺序 4.1 AutoConfigureBefore 操作演示 4.2 A…

安防视频平台EasyCVR视频调阅全屏播放显示异常是什么原因?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

AIRIOT亮相IOTE2023深圳物联网展,产品创新力再获“IOTE金奖”

9月20-22日&#xff0c;IOTE 2023第二十届深圳国际物联网展在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为物联网领域年度最重要的行业盛会之一&#xff0c;本届展会以“IoT构建数字经济底座”为主题&#xff0c;汇聚全球来自工业、物流、基建、智慧城市、智慧…