我用selenium开发了一个自动创建任务,解放重复性工作
我用selenium开发了一个自动创建任务,大大解放了我做重复性工作带来的疲惫感,收获了更多的乐趣。
我司有100多个服务,运维忙不过来的时候,就会让我们自己创建云负载,你首先需要在云服务上创建负载,再创建容器,配置好CPU、内存,创建镜像跟容器的触发器,创建Jenkins任务,每个服务都需要这些步骤,都是重复性工作枯燥乏味,如果只有一个人弄那格式不可忍受。
为了能够让这件事更有趣点,我使用了selenium来帮我做这些重复性工作。通过写到代码让其运行后,就能自动打开浏览器,填好指定文本,提交表单,下面来看看我是怎么用它来创建自动任务的,关键是获取WEB的唯一的DOM节点。
介绍
先来看看Selenium的介绍,没错它其实是一个自动化测试工具。
Selenium是一个用于Web应用程序测试的工具,它直接运行在浏览器中,可以模拟真正的用户操作。这个工具的主要功能包括测试与浏览器的兼容性(即测试应用程序是否能够很好地工作在不同浏览器和操作系统之上)和测试系统功能(即创建回归测试检验软件功能和用户需求)。Selenium支持自动录制动作和自动生成.Net、Java、Perl等不同语言的测试脚本。
Selenium主要包括三部分:Selenium IDE、Selenium WebDriver和Selenium Grid。Selenium IDE是Firefox浏览器的一个插件,可以进行录制回放,并且可以把录制的操作以多种语言(如JAVA、Python、C#等)的形式导出成测试用例。Selenium WebDriver提供Web自动化所需的API,主要用作浏览器控制、页面元素选择和调试。Selenium Grid则提供了在不同机器的不同浏览器上运行Selenium测试的能力。
Selenium支持跨不同浏览器、平台和编程语言的自动化,它可以轻松部署在Windows、Linux、Solaris和Macintosh等平台上。此外,Selenium通过使用特定于每种语言的驱动程序支持各种编程语言,包括C#、Java、Perl、PHP、Python和Ruby等。测试脚本可以使用任何支持的编程语言进行编码,并且可以直接在大多数现代Web浏览器中运行。
总的来说,Selenium是一个功能强大的Web自动化测试工具,它可以提高测试效率,减少人工测试的工作量,是Web开发人员和测试人员的重要工具之一。
下面是一个华为云创建负载的任务,另外发现华为云的DOM节点ID、class加有随机数,隔段时间就会变化,因此我的例子不能直接拿去用,要根据你自己的节点去修改,你要掌握思路。
创建浏览器驱动
首先你要根据你自己的浏览器,创建浏览器驱动,如下我创建了一个Safari浏览器驱动。
依赖
<dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.1.1</version></dependency>
// 创建Safari浏览器驱动
WebDriver driver = new SafariDriver();
//窗口大小
Dimension dimension = new Dimension(1000, 1000);
driver.manage().window().setSize(dimension);
登录
随后,你要通过代码去登录华为云。
private static void login(WebDriver driver) throws InterruptedException {driver.get("https://auth.huaweicloud.com/authui/login.html?service=https://console.huaweicloud.com/cceold/#/login");Thread.sleep(3000);//切换IAM用户//你要找到,你需要操作的DOM,唯一标识WebElement iamLinkDiv = driver.findElement(By.xpath("//*[@id=\"IAMLinkDiv\"]/span"));((JavascriptExecutor) driver).executeScript("arguments[0].click();", iamLinkDiv);// 查找并填写用户名和密码表单,点击提交按钮WebElement accountInput = driver.findElement(By.id("IAMAccountInputId"));WebElement usernameInput = driver.findElement(By.id("IAMUsernameInputId"));WebElement passwordInput = driver.findElement(By.id("IAMPasswordInputId"));WebElement submitButton = driver.findElement(By.id("btn_submit"));//点击一下,相当于激活该选中框accountInput.click();//把需要填的内容发送到指定的文本accountInput.sendKeys("xxx");usernameInput.sendKeys("xxx");passwordInput.sendKeys("xxx");//执行JS登录,因为有的表单是JS登录的,并不是用的form表单((JavascriptExecutor) driver).executeScript("arguments[0].click();", submitButton);// 等待Jenkins页面加载完成Thread.sleep(5000);}
创建任务
创建任务,也就是负载,你可以自定先声明要有哪些服务,描述是什么等
private static void createJob(WebDriver driver, List<String> services, List<String> failList) {for (String service: services) {String[] serviceAry = service.split(":");String serviceName = serviceAry [0];String serviceDescription = serviceAry [1];String serviceName = "";try {serviceName = serviceAry [2];} catch (Exception ex) {}try {System.out.println(String.format("------->正在创建任务[%s]......", serviceName));driver.get("https://console.huaweicloud.com/cce2.0/?agencyId=09d4dbb7a300f3a61fc5c003d92470f3®ion=cn-east-3&locale=zh-cn#/cce/cluster/fdd6c126-ebc2-11e9-bee9-0255ac1002c2/create/workload?namespace=paas&type=deployment");Thread.sleep(3000);//通过唯一ID获取指定的DOM,你看华为的ID后面都带了数字,会变WebElement nameInput = driver.findElement(By.id("ti_auto_id_13"));WebElement instanceInput = driver.findElement(By.id("ti_auto_id_15_input"));WebElement containerInput = driver.findElement(By.id("ti_auto_id_45"));WebElement imageInput = driver.findElement(By.id("ti_auto_id_46"));WebElement cpuMaxInput = driver.findElement(By.id("ti_auto_id_52"));WebElement memoryMaxInput = driver.findElement(By.id("ti_auto_id_55"));WebElement subButton = driver.findElement(By.id("ti_auto_id_237"));nameInput.sendKeys("service-" + serviceName);instanceInput.clear();instanceInput.sendKeys("1");//时区同步选择//执行JS操作,JS这个很好用,有些不能直接操作的DOM,都可以用JS去解决((JavascriptExecutor) driver).executeScript("document.getElementById(\"ti_auto_id_20_awrapper\").click();");//清空输入框内容containerInput.clear();containerInput.sendKeys("service-" + serviceName);((JavascriptExecutor) driver).executeScript("document.getElementById(\"ti_auto_id_47\").click();");List<WebElement> imageSearchInput = driver.findElements(By.className("ti3-searchbox-input"));imageSearchInput.get(0).sendKeys("service-" + serviceName);//回车imageSearchInput.get(0).sendKeys(Keys.ENTER);ThreadUtil.sleep(3000);//选择镜像List<WebElement> checkImage = driver.findElements(By.className("ti3-radio-skin"));((JavascriptExecutor) driver).executeScript("arguments[0].click();", checkImage.get(2));List<WebElement> checkImageClick = driver.findElements(By.className("ti3-btn-danger"));((JavascriptExecutor) driver).executeScript("arguments[0].click();", checkImageClick.get(1));ThreadUtil.sleep(2000);cpuMaxInput.clear();cpuMaxInput.sendKeys("1");memoryMaxInput.clear();memoryMaxInput.sendKeys("1024");//提交((JavascriptExecutor) driver).executeScript("arguments[0].click();", subButton);// 等待创建任务完成Thread.sleep(5000);} catch (Exception ex) {ex.printStackTrace();System.out.println("失败的任务[]" + serviceName);//这里我将失败的任务保存起来,等所有任务执行结束后,控制台可以输入继续执行//因为由于页面加载时间是不确定的,有时候会因为这个原因操作DOM失败failList.add(phantomService);}}}
退出关闭
最后可以关闭浏览器
// 关闭浏览器
driver.quit();
从我使用selenium的感受来说,非常强大,非常好用,虽然刚开始写代码一遍遍测试有点花时间,但当它自己跑起来,你就可以喝喝茶,看看它,非常的有趣惬意。
官网地址:https://www.selenium.dev/
作者其他文章推荐:
基于Spring Boot 3.1.0 系列文章
- Spring Boot 源码阅读初始化环境搭建
- Spring Boot 框架整体启动流程详解
- Spring Boot 系统初始化器详解
- Spring Boot 监听器详解
- Spring Boot banner详解
- Spring Boot 属性配置解析
- Spring Boot 属性加载原理解析
- Spring Boot 异常报告器解析
- Spring Boot 3.x 自动配置详解
相关文章:

我用selenium开发了一个自动创建任务,解放重复性工作
我用selenium开发了一个自动创建任务,大大解放了我做重复性工作带来的疲惫感,收获了更多的乐趣。 我司有100多个服务,运维忙不过来的时候,就会让我们自己创建云负载,你首先需要在云服务上创建负载,再创建容…...

安卓11修改HDMI自适应分辨率
客户需要hdmi自适应屏幕分辨率,没发现有相关的指令,我发现设置中有个hdmi的Auto选项,于是就试试选中这个选项,试下了可以自适应,于是就找到相关代码,在开机完成后执行这个代码,基本满足需求&…...

Linux实验记录:使用Apache的虚拟主机功能
前言: 本文是一篇关于Linux系统初学者的实验记录。 参考书籍:《Linux就该这么学》 实验环境: VmwareWorkStation 17——虚拟机软件 RedHatEnterpriseLinux[RHEL]8——红帽操作系统 正文: 目录 前言: 正文&…...

分布式空间索引了解与扩展
目录 一、空间索引快速理解 (一)区域编码 (二)区域编码检索 (三)Geohash 编码 (四)RTree及其变体 二、业内方案选取 三、分布式空间索引架构 (一)PG数…...

Set和Map的应用场景
Set: 1.成员不能重复 2.只有键值,没有键名,有点类似数组 3.可以遍历,方法 add,delete,has Map: 1.本质上是键值对的集合,类似集合; 2.可以遍历,方法很多,可以干跟各种数据格式转换 Set和…...

小白级教程,10秒开服《幻兽帕鲁》
在帕鲁的世界,你可以选择与神奇的生物「帕鲁」一同享受悠闲的生活,也可以投身于与偷猎者进行生死搏斗的冒险。帕鲁可以进行战斗、繁殖、协助你做农活,也可以为你在工厂工作。你也可以将它们进行售卖,或肢解后食用。 前言 马上过年…...

IDEA 构建开发环境
本博客主要讲解了如何创建一个Maven构建Java项目。(本文是创建一个用Maven构建项目的方式,所以需要对Maven有一定的了解) IDEA 构建开发环境 一、创建一个空工程二、构建一个普通的Maven模块 一、创建一个空工程 创建一个空的工程 * 设置整…...

归并排序----C语言数据结构
目录 引言 1.归并排序的实现----c2.归并排序的复杂度分析时间复杂度空间复杂度 引言 归并排序(Merge Sort) 是一种基于分治法的排序算法,它的基本思想是将原始数组划分成较小的数组,然后递归地对这些小数组进行排序,最后将排好序…...

【网站项目】065健康综合咨询问诊平台
🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板ÿ…...

Adobe Camera Raw forMac/win:掌控原始之美的秘密武器
Adobe Camera Raw,这款由Adobe开发的插件,已经成为摄影师和设计师们的必备工具。对于那些追求完美、渴望探索更多创意可能性的专业人士来说,它不仅仅是一个插件,更是一个能够释放无尽创造力的平台。 在数字摄影时代,R…...

OpenHarmony—开发及引用静态共享包(API 9)
HAR(Harmony Archive)是静态共享包,可以包含代码、C库、资源和配置文件。通过HAR可以实现多个模块或多个工程共享ArkUI组件、资源等相关代码。HAR不同于HAP,不能独立安装运行在设备上,只能作为应用模块的依赖项被引用。 接下来&a…...

测试面试题常见题
文章目录 功能测试一个完整的测试计划应该包含哪些内容一个完整的测试用例包含哪些内容?什么时候需要发测试报告?一份测试报告应该包含哪些内容?一个完整的缺陷报告应该包含哪些内容?简述等价类划分法并举例针对具体场景的测试用例…...

代码随想录算法训练营第六天 - 哈希表part02
454.四数之和II 核心思想:利用字典的key,value 4个数组两两分组,nums1nums2 的两两元素之和 及 计数 先存入字典中,然后对nums3和nums4的进行元素相加 然后对比字典中是否有对应的key,有就countvalue class Solution…...

【Javaweb程序设计】【C00165】基于SSM的高考志愿辅助填报系统(论文+PPT)
基于SSM的高考志愿辅助填报系统(论文PPT) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的高考志愿辅助填报系统 本系统分为前台系统模块、后台管理员模块以及后台学生模块 前台系统模块:当游客打开系统的网址后&…...

海外云手机为什么吸引用户?
近年来,随着全球化的飞速发展,海外云手机逐渐成为各行各业关注的焦点。那么,究竟是什么让海外云手机如此吸引用户呢?本文将深入探讨海外云手机的三大吸引力,揭示海外云手机的优势所在。 1. 高效的社交媒体运营 海外云…...

将`List<String>`转换为`List<Long>`
将List<String>转换为List<Long> 大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!在Java中,将List<String>转换为List<Long>可以…...

【Unity3D小功能】Unity3D中Text使用超链接并绑定点击事件
推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 在开发中遇到了要给Text加超链接的需求,研究了实现…...

MyBatis-Plus CRUD 接口
Service CRUD 接口 public String services() {Boolean re false;/**Service CRUD 接口**//**Save 返回boolean **///1、插入一条数据Person person1 new Person();person1.setEmail("123qq.com");person1.setSex("男");//person1.setUser_id(0);//影响…...

在JVM中,Java对象是如何创建、存储和访问的?
在Java虚拟机(JVM)中,Java对象的创建、存储和访问是Java程序运行的核心部分。这个过程涉及到内存管理、对象模型以及运行时数据区域的概念。 1. Java对象的创建: a. 类加载: 在Java程序运行时,类加载器负…...

C++类和对象之进击篇
目录 1.类的6个默认成员函数2.构造函数2.1概念2.2特性 3.析构函数3.1概念3.2特性 4.拷贝构造函数4.1 概念4.2特征 5.赋值运算符重载5.1运算符重载5.2赋值运算符重载5.3前置和后置重载 6.日期类的实现7.const成员8.取地址及const取地址操作符重载 1.类的6个默认成员函数 如果一…...

ElementUI 组件:Container 布局容器
ElementUI安装与使用指南 Container 布局容器 点击下载learnelementuispringboot项目源码 效果图 el-container.vue(Container 布局容器)页面效果图 项目里el-container.vue代码 <script> import PagePath from "/components/PagePat…...

小米商城服务治理之客户端熔断器(Google SRE客户端熔断器)
目录 前言 一、什么是Google SRE熔断器 二、Google SRE 熔断器的工作流程: 三、客户端熔断器 (google SRE 熔断器) golang GRPC 实现 四、客户端熔断器 (google SRE 熔断器) golang GRPC单元测试 大家可以关注个人博客:xingxing – Web Developer …...

Springboot 校验工具类
校验工具类 这个实现逻辑很简单,就是调用string的正则表达式 我这里的代码要导入糊涂工具包 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.17</version> </dependency>import…...

编程笔记 html5cssjs 069 JavaScrip Undefined数据类型
编程笔记 html5&css&js 069 JavaScrip Undefined数据类型 一、undefined数据类型二、类型运算小结 在JavaScript中,undefined 是一种基本数据类型,它表示一个变量已经声明但未定义(即没有赋值)或者一个对象属性不存在。 一…...

MySQL 处理JSON字符串
目录 前言 JSON值的部分更新 创建JSON值 JSON 值的规范化、合并和自动包装 合并JSON值 搜索和修改JSON值 JSON路径 JSON值的比较和排序 JSON值的聚合 前言 现在很多数据会以json格式存储,如果你还在用like查询json字符串,那你就OUT了࿰…...

python爬虫-多线程-数据库——WB用户
数据库database的包: Python操作Mysql数据库-CSDN博客 效果: 控制台输出: 数据库记录: 全部代码: import json import os import threading import tracebackimport requests import urllib.request from utils im…...

有向图查询所有环,非递归
图: 有向图查询所有环,非递归: import java.util.*;public class CycleTest {private final int V; // 顶点数private final List<List<Integer>> adjList; // 邻接表public CycleTest(int vertices) {this.V vertices;this.…...

SpringBoot 使用WebSocket功能
实现步骤: 1.导入WebSocket坐标。 在pom.xml中增加依赖项: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dependency>2.编写WebSocket配…...

HTML5的新特性
目录 一,新增语义化标签 二,新增的多媒体标签 三,新增input表单 四,新增的表单属性 一,新增语义化标签 二,新增的多媒体标签 1,音频:<audio>.。。用MP3 <audio src…...

Filter过滤器学习使用
验证token 对外API过滤器 public class APIFilter implements Filter {private static Logger logger LogManager.getLogger(APIFilter.class);private ICachedTokenService tokenService;public APIFilter(ICachedTokenService tokenService) {super();this.tokenService …...