当前位置: 首页 > 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();}
}

 

相关文章:

  • C++ 信息学奥赛总复习题答案解析(第一章)
  • 在Ubuntu22.04 系统中安装Docker详细教程
  • 【hadoop】相关集群开启命令
  • Vue3学习(4)- computed的使用
  • 基于Python学习《Head First设计模式》第八章 模板方法模式
  • 力扣HOT100之二分查找:33. 搜索旋转排序数组
  • 热电厂中控室无线集控:高清视频监测+PLC远程操控
  • 调试器基本原理
  • 高精度算法--四则运算模板(附例题)
  • 心理咨询技能竞赛流程方案
  • day 47
  • 知识改变命运?如何有规划的学好计算机专业?
  • Codeforces Round 509 (Div. 2) C. Coffee Break
  • 【AI论文】反思、重试、奖励:通过强化学习实现大型语言模型的自我提升
  • Go 标准库 encoding/gob 快速上手
  • Python项目中添加环境配置文件
  • 【Elasticsearch】映射:Join 类型、Flattened 类型、多表关联设计
  • Python 函数全攻略:函数进阶(生成器、闭包、内置函数、装饰器、推导式)
  • 柯尼卡美能达Konica Minolta bizhub 205i打印机信息
  • 《机器学习》(周志华)第一章 绪论
  • 百度网站名称和网址/一份完整的市场调查方案
  • 赣州省住房和城乡建设厅网站/东莞百度快速优化排名
  • 作作网站/优秀网站设计网站
  • 北京北站/seo 优化教程
  • 大连网站专业制作/真正免费的网站建站平台推荐
  • 品牌产品策划方案/网站优化 推广