我用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 自动配置详解
相关推荐
互联网杂货铺15 分钟前
基于Selenium+Python的web自动化测试框架(附框架源码+项目实战)
自动化测试·软件测试·python·selenium·测试工具·单元测试·测试用例
水宝的滚动歌词2 小时前
K8S单节点部署及集群部署
云原生·容器·kubernetes
yohoo菜鸟4 小时前
kubernetes简单入门实战
云原生·容器·kubernetes
Lyqfor7 小时前
云原生学习
java·分布式·学习·阿里云·云原生
小白~小黑10 小时前
软件测试基础二十(接口测试 Postman)
python·自动化·postman
Smile丶凉轩10 小时前
微服务即时通讯系统的实现(客户端)----(1)
微服务·云原生·架构
南慕小白10 小时前
云原生后端
云原生
小安运维日记12 小时前
CKA认证 | Day3 K8s管理应用生命周期(上)
运维·云原生·容器·kubernetes·云计算·k8s
明月清风徐徐12 小时前
Scrapy爬取豆瓣电影Top250排行榜
python·selenium·scrapy
小han的日常12 小时前
接口自动化环境搭建
运维·自动化