我用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.seleniumgroupId>
<artifactId>selenium-javaartifactId>
<version>4.1.1version>
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 自动配置详解