Web⾃动化测试及常用函数
目录
1.准备工作
1.1安装驱动管理
1.2Selenium
1.3⼀个简单的web⾃动化示例
2.操作测试对象
2.1点击/提交对象
2.2 模拟按键输⼊
2.3清除⽂本内容
2.4 获取⽂本信息
2.5获取当前⻚⾯标题
2.6获取当前⻚⾯URL
3.窗⼝
3.1 切换窗⼝
3.2窗⼝设置大小
4.屏幕截图
5.等待
5.1强制等待
5.2隐式等待
5.3显式等待
6.浏览器导航
6.1打开⽹站
6.2浏览器的前进、后退、刷新
7.弹窗
8.⽂件上传
9.浏览器参数设置
9.1无头模式
9.2浏览器加载策略
1.准备工作
1.1安装驱动管理
WebDriverManager是⼀个开源Java库,以完全⾃动化的⽅式对Selenium WebDriver所需的驱动程 序(如chromedriver、geckodriver、msedgedriver等)进⾏管理(即下载、设置和维护)。
<dependency>
<groupId>io.github.bonigarcia</groupId>
<artifactId>webdrivermanager</artifactId>
<version>5.8.0</version>
</dependency>
1.2Selenium
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.0.0</version>
</dependency>
1.3⼀个简单的web⾃动化示例
测试百度搜索关键词;假面骑士
操作:
1. 打开浏览器 使用驱动来打开 2. 输入完整的网址:https://www.baidu.com 3. 找到输入框,并输入关键词:假面骑士 4. 找到百度一下按钮,并点击 5. 关闭浏览器
//测试百度搜索关键词;假面骑士
void test01() throws InterruptedException {
//1. 打开浏览器 使用驱动来打开
WebDriverManager.chromedriver().setup();
//增加浏览器配置:创建驱动对象要强制指定允许访问所有的链接
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
ChromeDriver driver = new ChromeDriver(options);
Thread.sleep(2000);
//2. 输入完整的网址:https://www.baidu.com
driver.get("https://www.baidu.com");
Thread.sleep(2000);
//3. 找到输入框,并输入关键词:假面骑士
driver.findElement(By.cssSelector("#kw")).sendKeys("假面骑士");
Thread.sleep(2000);
//4. 找到百度一下按钮,并点击
driver.findElement(By.cssSelector("#su")).click();
Thread.sleep(2000);
//5. 关闭浏览器
driver.quit();
}
2.操作测试对象
2.1点击/提交对象
driver.findElement(By.cssSelector("#su")).click();
隐藏元素不可点击的;
2.2 模拟按键输⼊
driver.findElement(By.cssSelector("#kw")).sendKeys("假面骑士");
2.3清除⽂本内容
driver .findElement(By. cssSelector ( "#kw" )).sendKeys( " 我爱游戏 " );driver.findElement(By. cssSelector ( "#kw" )).clear();driver .findElement(By. cssSelector ( "#kw" )).sendKeys( " 我爱学习 " );
2.4 获取⽂本信息
//获得百度热搜第一条 String text = driver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(1) > a > span.title-content-title")).getText(); System.out.println(text);
补:获取属性值需要使⽤⽅法 getAttribute("属性名称")
2.5获取当前⻚⾯标题
String title = driver.getTitle();
2.6获取当前⻚⾯URL
String currentUrl = driver.getCurrentUrl();
3.窗⼝
3.1 切换窗⼝
String curHandle = driver.getWindowHandle();
for (String w : driver.getWindowHandles()) {
if (w != curHandle) {
driver.switchTo().window(w);
}
}
使用例子:
// 切换窗⼝搜假面骑士
void test01() throws InterruptedException {
createDriver();
Thread.sleep(3000);
driver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();
Thread.sleep(3000);
String curHandle = driver.getWindowHandle();
for (String w : driver.getWindowHandles()) {
if (w != curHandle) {
driver.switchTo().window(w);
}
}
//找到输入框,并输入关键词:假面骑士
driver.findElement(By.cssSelector("#ww")).sendKeys("假面骑士");
Thread.sleep(2000);
//找到百度一下按钮,并点击
driver.findElement(By.cssSelector("#s_btn_wr")).click();
Thread.sleep(2000);
//关闭窗⼝
driver.close();
Thread.sleep(2000);
driver.quit();
}
3.2窗⼝设置大小
// 窗⼝最⼤化driver.manage().window().maximize();// 窗⼝最⼩化driver.manage().window().minimize();// 全屏窗⼝driver.manage().window().fullscreen();// ⼿动设置窗⼝⼤⼩driver.manage().window().setSize( new Dimension ( 1024 , 1024 ));
4.屏幕截图
<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency>
套路代码:
void getScreenShot(String str) throws IOException {
// ./src/test/image/
// /2024-07-17/
// /test01-174530.png
// /test02-174530.png
// /2024-07-18/
// /test01-174530.png
// /test02-174530.png
//屏幕截图
SimpleDateFormat sim1 = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat sim2 = new SimpleDateFormat("HHmmss");
String dirTime = sim1.format(System.currentTimeMillis());
String fileTime = sim2.format(System.currentTimeMillis());
//./src/test/image/2024-07-17/test01-174530.png
String filename ="./src/test/image/"+ dirTime +"/" + str + "-" + fileTime+".png";
System.out.println("filename:"+filename);
File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
//srcFile放到指定位置
FileUtils.copyFile(srcFile,new File(filename));
}
5.等待
通常代码执⾏的速度⽐⻚⾯渲染的速度要快,如果避免因为渲染过慢出现的⾃动化误报的问题呢?可 以使⽤selenium中提供的三种等待⽅法:
5.1强制等待
优点:使⽤简单,调试的时候⽐较有效缺点:影响运⾏效率,浪费⼤量的时间
5.2隐式等待
implicitlyWait() 参数:Duration类中提供的毫秒、秒、分钟等⽅法
例子:
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(2));
优点:智能等待,作⽤于全局。
5.3显式等待
显⽰等待也是⼀种智能等待,在指定超时时间范围内只要满⾜操作的条件就会继续执⾏后续代码
• elementToBeClickable(By locator) ‒ ⽤于检查元素的期望是可⻅的并已启⽤,以便您可以单击它。• textToBe (Bylocator , String str) - 检查元素。• presenceOfElementLocated(Bylocator) ‒ 检查⻚⾯的 DOM 上是否存在元素。• urlToBe(java.lang.String url) ‒ 检查当前⻚⾯的 URL 是⼀个特定的 URL
使用:
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
boolean ispass = wait.until(ExpectedConditions.textToBe(By.cssSelector("#s-top
left > a:nth - child(1) "), " 新闻 "));
if (ispass) {
System.out.println("测试通过");
} else {
System.out.println("测试失败");
}
优点:显⽰等待是智能等待,可以⾃定义显⽰等待的条件,操作灵活缺点:写法复杂
6.浏览器导航
6.1打开⽹站
// 更⻓的⽅法driver.navigate().to( "https://selenium.dev" );// 简洁的⽅法driver.get( "https://selenium.dev" );
6.2浏览器的前进、后退、刷新
driver.navigate().back();driver.navigate().forward();driver.navigate().refresh();
使用案例:
//浏览器导航
void test02() throws InterruptedException {
createDriver();
//找到输入框,并输入关键词:假面骑士
driver.findElement(By.cssSelector("#kw")).sendKeys("假面骑士");
Thread.sleep(2000);
//找到百度一下按钮,并点击
driver.findElement(By.cssSelector("#su")).click();
Thread.sleep(2000);
driver.navigate().back();
Thread.sleep(2000);
driver.navigate().forward();
Thread.sleep(2000);
driver.navigate().refresh();
Thread.sleep(2000);
driver.quit();
}
7.弹窗
弹窗是在⻚⾯是找不到任何元素的,这种情况怎么处理?使⽤selenium提供的Alert接⼝
Alert alert = driver.switchTo.alert();//向弹窗的输入框中输入alert.sendKeys("hello");//确认alert.accept();//取消alert.dismiss();
8.⽂件上传
WebElement ele = driver.findElement(By.cssSelector("body > div > div > input[type=file]"));ele.sendKeys("D:\\selenium2html\\selenium2html\\upload.html");
9.浏览器参数设置
9.1无头模式
可以避免打开浏览器,节省资源
//设置无头模式
// options.addArguments("-headless");
9.2浏览器加载策略
1.normal:等待整个页面加载完毕再开始执行操作
2.eager:等待整个dom树加载完成,即DOMContentLoaded这个事件完成,也就是只要HTML 完全加载和解析完毕就开始执行操作。放弃等待图片、样式、子帧的加载。
3.none:等待html下载完成,哪怕还没开始解析就开始执行操作。
//浏览器加载策略
// options.setPageLoadStrategy(PageLoadStrategy.NORMAL);
options.setPageLoadStrategy(PageLoadStrategy.EAGER);
// options.setPageLoadStrategy(PageLoadStrategy.NONE);
以上为我个人的小分享,如有问题,欢迎讨论!!!
都看到这了,不如关注一下,给个免费的赞