我用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浏览器驱动。

依赖

xml 复制代码
 <dependency>
   <groupId>org.seleniumhq.selenium</groupId>
   <artifactId>selenium-java</artifactId>
   <version>4.1.1</version>
 </dependency>
java 复制代码
// 创建Safari浏览器驱动
WebDriver driver = new SafariDriver();
//窗口大小
Dimension dimension = new Dimension(1000, 1000);
driver.manage().window().setSize(dimension);

登录

随后,你要通过代码去登录华为云。

java 复制代码
 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);
  }

创建任务

创建任务,也就是负载,你可以自定先声明要有哪些服务,描述是什么等

java 复制代码
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&region=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);
         }

     }
 }

退出关闭

最后可以关闭浏览器

java 复制代码
// 关闭浏览器
driver.quit();

从我使用selenium的感受来说,非常强大,非常好用,虽然刚开始写代码一遍遍测试有点花时间,但当它自己跑起来,你就可以喝喝茶,看看它,非常的有趣惬意。

官网地址:https://www.selenium.dev/


作者其他文章推荐:

基于Spring Boot 3.1.0 系列文章

  1. Spring Boot 源码阅读初始化环境搭建
  2. Spring Boot 框架整体启动流程详解
  3. Spring Boot 系统初始化器详解
  4. Spring Boot 监听器详解
  5. Spring Boot banner详解
  6. Spring Boot 属性配置解析
  7. Spring Boot 属性加载原理解析
  8. Spring Boot 异常报告器解析
  9. Spring Boot 3.x 自动配置详解
相关推荐
ABdolphin5 小时前
Spring-cloud 主键Eureka
java·云原生·eureka
Aesopcmc6 小时前
Maven打包时指定输出路径、以时间戳命名包名和路径名,结合IDEA以指令脚本方式动态配置输出目录
java·自动化·maven·intellij-idea
AKAMAI7 小时前
AI推理硬件选型指南:CPU 与 GPU 的抉择
人工智能·云原生·云计算
Serverless 社区11 小时前
算力成本降低 33%,与光同尘用 Serverless AI 赋能影视商业内容生产
人工智能·云原生·serverless
没有口袋啦12 小时前
《云原生基础设施》
云原生·容器·kubernetes·华为云
安冬的码畜日常13 小时前
【JUnit实战3_28】第十七章:用 JUnit 5 实测 SpringBoot 项目
spring boot·功能测试·测试工具·设计模式·单元测试·junit5
阿里云云原生14 小时前
低至 1% 性能损耗:阿里云 ARMS 配置模板如何实现精准可控的 JMX 数据采集
云原生
马达加斯加D16 小时前
k8s --- resource 资源
云原生·容器·kubernetes
程序员三藏16 小时前
接口自动化测试框架搭建详解
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试
阿里云云原生17 小时前
火热报名中!2025 龙蜥操作系统大会亮点速递
云原生