当前位置: 首页 > news >正文

selenium自动化测试学习心得1

1. 关于测试用例的顺序

首先在你测试的主类上面写@TestMethodOrder(MethodOrderer.OrderAnnotation.class)

然后在测试用例上面, 写@Order(),里面的数字越小,测试的优先级越大

2. 关于getText()和getAttribute("innerText")

getText() 是 Selenium 方法,主要用于获取可见文本,且无需担心是否有隐藏的元素。getAttribute("innerText") 是 JavaScript 方法,获取的是 innerText 属性的值,它会考虑到元素的可见性。

一般获取内容使用getText()足够了,如果获取不到就用getAttribute("innerText")

3. 关于处理Editor.md的文本域

一般我们直接定位,然后sendKeys()是输入不了的

我们需要借助Actions来处理复杂的用户交互操作,点击,键盘输入...

代码

       element = driver.findElement(By.cssSelector("#edit-article > div.CodeMirror.cm-s-default.CodeMirror-wrap > div.CodeMirror-scroll > div.CodeMirror-sizer > div > div > div > div.CodeMirror-code > div > pre"));// 向文本框输入内容Actions action = new Actions(driver);action.doubleClick(element).sendKeys(Keys.DELETE).perform();action.sendKeys("我是测试内容!").perform();

具体的解释

 4. 关于页面太大,需要点击滚动条到相应地方去定位元素

发布按钮在页面底部, 因此我们要先滚动到底部才能定位元素

具体代码

   // 滚动页面到底部JavascriptExecutor js = (JavascriptExecutor) driver;js.executeScript("window.scrollTo(0, document.body.scrollHeight);");  // 滚动到底部Thread.sleep(2000);// 滚动到底部// 定位发布按钮WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(2));element = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#article_post_submit")));element.click();

解释

5. 关于一些常用的统一工具类

创建驱动, 截图,处理弹窗

package org.xiaobai.forum.testFunction.common;import org.apache.commons.io.FileUtils;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.SessionId;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.time.Duration;public class Utils {public static WebDriver driver = null;private static SessionId sessionId;//创建驱动对象public static WebDriver createDriver() {if (driver == null || sessionId == null) {//增加浏览器配置对象,创建驱动对象的时候要强制运行访问所有的链接ChromeOptions options = new ChromeOptions();//表示运行所有的链接options.addArguments("--remote-allow-origins=*");//设置无头模式
//            options.addArguments("-headless");//添加浏览器策略
//        options.setPageLoadStrategy(PageLoadStrategy.NONE);//等待所有页面加载完成//创建浏览器驱动对象,把配置放进驱动对象driver = new ChromeDriver(options);//添加隐式等待,全局元素等待2sdriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(2));}return driver;}//统一创建驱动对象public Utils() throws InterruptedException {//调用driver对象driver = createDriver();}//屏幕截图public void getScreenShot(String str) throws InterruptedException, IOException {//保存的图片路径: ./src/test/image///                              /2024-08-17///                                          /test01-1743211.png//                                          /test02-1743222.png//                                          /test03-1743245.png//                              /2024-08-18///                                          /test01-1743222.png//                                          /test02-1743442.png//                                          /test03-1743332.png//
//          createDriver();//屏幕截图//设计文件日期格式SimpleDateFormat sim1 = new SimpleDateFormat("yyyy-MM-dd");//参数是年月日SimpleDateFormat sim2 = new SimpleDateFormat("HHmmssSS");//参数时分秒毫秒//生成当前的时间String dirTime = sim1.format(System.currentTimeMillis());String fileTime = sim2.format(System.currentTimeMillis());//拼接文件路径//./src/test/image/2024-08-17/test01-17432.pngString filename = "./src/test/image/" + dirTime + "/" + str + "-" + fileTime + ".png";//方法名-时间.pngFile srcFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);//把srcFile放到指定位置FileUtils.copyFile(srcFile, new File(filename));}//统一处理弹窗public static void handleAlert() {WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(1));wait.until(ExpectedConditions.alertIsPresent());//处理弹窗Alert alert = driver.switchTo().alert();alert.accept();}
}

6. 关于自动化测试目录结构和使用

目录结构

Utils是统一工具类

testPage里面放测试的页面(测试某个功能)

Runtest 是自动化测试的入口主类

让每个测试page类继承Utils并重写构造方法, 然后定义要跳转的url路径,初始化WebElemnt

写好一个功能后,就去测试主类进行创建并且调用相关的方法

给一个代码例子

Utils类

package org.xiaobai.forum.testFunction.common;import org.apache.commons.io.FileUtils;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.SessionId;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.time.Duration;public class Utils {public static WebDriver driver = null;private static SessionId sessionId;//创建驱动对象public static WebDriver createDriver() {if (driver == null || sessionId == null) {//增加浏览器配置对象,创建驱动对象的时候要强制运行访问所有的链接ChromeOptions options = new ChromeOptions();//表示运行所有的链接options.addArguments("--remote-allow-origins=*");//设置无头模式
//            options.addArguments("-headless");//添加浏览器策略
//        options.setPageLoadStrategy(PageLoadStrategy.NONE);//等待所有页面加载完成//创建浏览器驱动对象,把配置放进驱动对象driver = new ChromeDriver(options);//添加隐式等待,全局元素等待2sdriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(2));}return driver;}//统一创建驱动对象public Utils() throws InterruptedException {//调用driver对象driver = createDriver();}//屏幕截图public void getScreenShot(String str) throws InterruptedException, IOException {//保存的图片路径: ./src/test/image///                              /2024-08-17///                                          /test01-1743211.png//                                          /test02-1743222.png//                                          /test03-1743245.png//                              /2024-08-18///                                          /test01-1743222.png//                                          /test02-1743442.png//                                          /test03-1743332.png//
//          createDriver();//屏幕截图//设计文件日期格式SimpleDateFormat sim1 = new SimpleDateFormat("yyyy-MM-dd");//参数是年月日SimpleDateFormat sim2 = new SimpleDateFormat("HHmmssSS");//参数时分秒毫秒//生成当前的时间String dirTime = sim1.format(System.currentTimeMillis());String fileTime = sim2.format(System.currentTimeMillis());//拼接文件路径//./src/test/image/2024-08-17/test01-17432.pngString filename = "./src/test/image/" + dirTime + "/" + str + "-" + fileTime + ".png";//方法名-时间.pngFile srcFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);//把srcFile放到指定位置FileUtils.copyFile(srcFile, new File(filename));}//统一处理弹窗public static void handleAlert() {WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(1));wait.until(ExpectedConditions.alertIsPresent());//处理弹窗Alert alert = driver.switchTo().alert();alert.accept();}
}
页面RegisPage 
package org.xiaobai.forum.testFunction.testPage;import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.xiaobai.forum.testFunction.common.Utils;import java.time.Duration;public class RegisPage extends Utils {// 定义传送路径public static String regisPageUrl = "http://127.0.0.1:8080/sign-up.html";public RegisPage() throws InterruptedException {super();}// 创建elementprivate  static WebElement element = null;//TODO 正确public void RegisRight() {// 进入注册页面driver.get(regisPageUrl);// 创建 WebDriverWait 对象WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(2));// 用户名element = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#username")));element.sendKeys("lixiaohei");// 昵称element = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#nickname")));element.sendKeys("李小黑");// 密码element = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#password")));element.sendKeys("123456");// 确认密码element = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#passwordRepeat")));element.sendKeys("123456");// 勾选协议element = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#policy")));element.click();// 定位注册按钮element = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#submit")));element.click();// 断言注册成功进入了登录页面// 断言当前 URL 是否是登录页面的 标题String pageTitle = driver.getTitle();System.out.println(pageTitle);assert pageTitle.equals("比特论坛 - 用户注册");// 关闭页面driver.quit();}// TODO 注册失败public void RegisFalse(){driver = new ChromeDriver();// TODO 空的情况// 进入注册页面driver.get(regisPageUrl);// 创建 WebDriverWait 对象WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(2));// 只测试用户名为空// 用户名element = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#username")));element.sendKeys("");// 昵称element = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#nickname")));element.sendKeys("李小黑");// 密码element = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#password")));element.sendKeys("123456");// 确认密码element = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#passwordRepeat")));element.sendKeys("123456");// 勾选协议element = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#policy")));element.click();// 定位注册按钮element = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#submit")));element.click();//定位提示信息element = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#signUpForm > div > div:nth-child(2) > div")));assert element.getText().equals("用户名不能为空");// 刷新页面driver.navigate().refresh();// TODO 长度小于6// 用户名element = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#username")));element.sendKeys("lixiaohei");// 昵称element = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#nickname")));element.sendKeys("李小黑");// 密码(长度<6)element = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#password")));element.sendKeys("123");// 确认密码element = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#passwordRepeat")));element.sendKeys("123");// 勾选协议element = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#policy")));element.click();// 定位注册按钮element = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#submit")));element.click();// 断言是否出现提示信息element = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("body > div.jq-toast-wrap.bottom-right > div > h2")));assert element.getText().equals("警告");// 刷新页面driver.navigate().refresh();// TODO 包含select// 用户名(包含select)element = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#username")));element.sendKeys("selectlixiaohei");// 昵称element = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#nickname")));element.sendKeys("李小黑");// 密码element = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#password")));element.sendKeys("123456");// 确认密码element = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#passwordRepeat")));element.sendKeys("123456");// 勾选协议element = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#policy")));element.click();// 定位注册按钮element = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#submit")));element.click();// 断言出现警告element = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("body > div.jq-toast-wrap.bottom-right > div > h2")));assert element.getText().equals("警告");driver.quit();}}

测试入口类RunTest

package org.xiaobai.forum.testFunction;import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
import org.xiaobai.forum.testFunction.testPage.*;@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class RunTest {@Test@Order(1)void testRegis() throws InterruptedException {//TODO 1. 注册RegisPage regisPage = new RegisPage();// 注册成功regisPage.RegisRight();// 注册失败regisPage.RegisFalse();}@Test@Order(2)void testLogin() throws InterruptedException {//TODO 2. 登录LoginPage loginPage = new LoginPage();// 登录成功loginPage.LoginTrue();// 登录失败loginPage.LoginFalse();}@Test@Order(3)void testPublishPost() throws InterruptedException {//TODO 3. 上传帖子PublishPostPage publishPostPage = new PublishPostPage();// 发布成功publishPostPage.publishSuccess();// 发布失败publishPostPage.publishFail();}@Test@Order(4)void testEditePost() throws InterruptedException {// TODO 4. 修改帖子信息EditPostPage editPostPage = new EditPostPage();editPostPage.EditPost();}@Test@Order(5)void testDetailPost() throws InterruptedException {//TODO 5. 查看帖子详情DetailPostPage detailPostPage = new DetailPostPage();detailPostPage.Detail();}@Test@Order(6)void testDeletePost() throws InterruptedException {//TODO 6. 删除帖子DeletePostPage deletePostPage = new DeletePostPage();deletePostPage.deletePost();}@Test@Order(7)void testEditPerson() throws InterruptedException {//TODO 7. 修改个人信息EditPersonPage editPersonPage = new EditPersonPage();// 编辑成功editPersonPage.EditSuccess();// 编辑失败editPersonPage.EditFail();}
}

 

http://www.xdnf.cn/news/925795.html

相关文章:

  • 阿里巴巴ROLL:大规模强化学习优化的高效易用解决方案
  • CDTJDT是开发SAST工具的有力引擎
  • Java 并发编程系列(上篇):多线程深入解析
  • Java Map完全指南:从基础到高级应用
  • Cell-o1:强化学习训练LLM解决单细胞推理问题
  • 基于Ubuntu22.04安装SVN服务器之仓库迁移
  • 基于IDA的bindiff使用
  • Java并发编程之并发编程的调试与测试
  • 【MLLM】字节BAGEL多模态理解和生成统一模型
  • 数字通信复习
  • RAG检索系统的两大核心利器——Embedding模型和Rerank模型
  • ELF文件,静态链接(Linux)
  • 算法练习-回溯
  • 指针与函数参数传递详解 —— 值传递与地址传递的区别及应用
  • Postman测试学习(1)
  • ABAP EXCEL导入换行符
  • A Survey on the Memory Mechanism of Large Language Model based Agents
  • 【Go语言基础【12】】指针:声明、取地址、解引用
  • 策略模式实战:Spring中动态选择商品处理策略的实现
  • 软件测试—学习Day10
  • 开疆智能Ethernet/IP转Modbus网关连接MAG8000电池流量计配置案例
  • python版若依框架开发:集成Dash应⽤
  • 将 Elastic 的数据摄取转向 OpenTelemetry
  • SWE-Dev:开启自主特征驱动软件开发新纪元,重新定义大模型编码能力边界
  • 理解 RAG_HYBRID_BM25_WEIGHT:打造更智能的混合检索增强生成系统
  • 【Go核心编程】第十三章:接口与多态——灵活性的艺术
  • FUSSNet复现
  • vue注册自定义指令
  • 黄柏基因组-小檗碱生物合成的趋同进化-文献精读142
  • h5 安卓手机去掉滚动条问题