我用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&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);
         }

     }
 }

退出关闭

最后可以关闭浏览器

// 关闭浏览器
driver.quit();

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


02-01 10:23