赞
踩
我用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 系列文章
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。