Web自动化测试:从元素定位到弹窗处理

一,元素的定位

web自动化测试的操作核心是能够找到页面对应的元素,然后才能对元素进行具体的操作。常见的主要是cssSelector和xpath

1.1 cssSelector

选择器的功能:选中页面中指定的标签元素

选择器的种类分为基础选择器复合选择器,常见的元素定位方式可以通过id选择器和子类选择器来进行定位

1.2 xpath

XML路径语言,不仅可以在XML文件中查找信息,还可以在HTML中选取节点。 xpath使用路径表达式来选择xml文档中的节点

xpath语法中:

  • 获取HTML页面所有的节点 //*
  • 获取HTML页面指定的节点 //指定节点(如://ul :获取HTML页面所有的ul节点)
  • 获取一个节点中的直接子节点 / (如://span/input)
  • 获取一个节点的父节点 .. (如://input/.. 获取input节点的父节点)
  • 实现节点属性的匹配 @... (如://*@id='kw' 匹配HTML页面中id属性为kw的节点)
  • 使用指定索引的方式获取对应的节点内容,注:xpath的索引是从1开始的。
    (如:百度首页通过://div/ul/li3 定位到第三个百度热搜标签)

具体操作:进入页面后,可按F12或ctrl+shift+l

再点击一下标红地方

就可以对选取想要选取部分的xpath或cssselect进行选择了

二,操作测试对象

2.1 点击/提交对象

click()

*//*找到百度⼀下按钮并点击
driver.findElement(By.cssSelector("#su")).click();

2.2 模拟按键输入

sendKeys(" ")

driver.findElement(By.cssSelector("#kw")).sendKeys("输⼊⽂字");

2.3 清除文本内容

clear()

driver.findElement(By.cssSelector("#kw")).sendKeys("蔡徐坤");
driver.findElement(By.cssSelector("#kw")).clear();
driver.findElement(By.cssSelector("#kw")).sendKeys("王安宇");

2.4 获取文本信息

getText()

driver.findElement(By.xpath("//*@id="title-content"/span1")).getText();

2.5 获取当前页面标题

getTitle()

2.6 获取当前页面url

getCurrentUrl()

三,窗口

当我们手工测试的时候,我们可以通过眼睛来判断当前的窗口是什么,但对于程序来说它是不知道当前最新的窗口应该是哪⼀个。对于程序识别每⼀个窗口,每个浏览器窗口都有一个唯一的属性句柄(handle)来表示,我们就可以通过句柄来切换

3.1 切换窗口

3.1.1 获取当前页面句柄

driver.getWindowHandle();

3.1.2 获取所有页面句柄

driver.getWindowHandles();

3.1.3 切换当前句柄为最新页面

String curWindow = driver.getWindowHandle();
Set<String> allWindow = driver.getWindowHandles();
for( String w : allWindow){
if(w!=curWindow){
driver.switchTo().window(w);
}
}

3.2 窗口大小设置

*//*窗⼝最⼤化
driver.manage().window().maximize();
//窗⼝最⼩化
driver.manage().window().minimize();
*//全屏窗⼝
driver.manage().window().fullscreen();
*//
⼿动设置窗⼝⼤⼩

driver.manage().window().setSize(new Dimension(x, y)); (x,y为自定义大小的数值)

3.3 窗口切换

*//*获取所有句柄
*//*获取当前停留⻚⾯句柄
String curWindow = driver.getWindowHandle();
Set<String> allWindow = driver.getWindowHandles();
for( String w : allWindow){
if(w!=curWindow){
driver.switchTo().window(w);
}
}

3.4 屏幕截图

屏幕截图需要额外导入包

复制代码
<dependency>
 <groupId>commons-io</groupId>
 <artifactId>commons-io</artifactId>
 <version>2.6</version>
</dependency>

截图的方法代码

File file = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(file,new File(filename));

3.5 关闭窗口

driver.close();
注意:窗口关闭后driver要重新定义

四,等待

通常情况下,代码执行速度比页面的渲染速度更快,为了避免代码因渲染未完成出现报错,需要使用等待方法

4.1 强制等待

Thread.sleep( )

固定休眠固定时长,不管页面有没有加载完成,代码都会卡死等待指定秒数。

优点:使用简单,调式时比较有效

缺点:等待时间写短容易报错,写长浪费执行时间,项目中尽量少用。

4.2 隐式等待

implicitlyWait() 参数:Duration类中提供的毫秒、秒、分钟等方法
如:
//隐式等待10000**毫秒
driver.manage().timeouts().implicitlyWait(Duration.ofMillis(10000));
//隐式等待60
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(60));
隐式等待作用域是整个脚本的所有元素。即只要driver对象没有被释放掉(driver.quit()),隐式等待就一直生效。
优点:智能等待,作用于全局
缺点:只能等待元素存在,无法判断元素可点击、可见,弹窗、文本校验场景不好用

4.3 显式等待

new WebDriverWait(driver, Duration.ofSeconds(超时秒数)).until(条件对象);
(until () 内传入ExpectedConditions类提供的页面状态条件)
如:
// 1. 创建等待对象,设置最长等待3秒
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(3));
// 2. 等待id为#id的按钮变为可点击状态,返回该元素并点击
WebElement submitBtn=wait.until(ExpectedConditions.elementToBeClickable
(By.cssSelector("#id")));
submitBtn.click();
显示等待也是⼀种智能等待,在指定超时时间范围内只要满足操作的条件就会继续执行后续代码,
特点:

  • 局部生效:只作用于这一行等待代码,不影响全局;
  • 精准等待:可指定等待「元素可见、可点击、文本出现、弹窗消失」等具体状态;
  • 自动化推荐首选:相比强制等待、隐式等待,执行速度更快、脚本稳定性更高。
    优点:显示等待是智能等待,可以自定义显示等待的条件,操作灵活
    缺点:写法复杂

不要混合隐式和显式等待,可能会导致不可预测的等待时间

五,浏览器导航

5.1 打开网站

// 方法一
driver.navigate().to("https://selenium.dev");
// 方法二
driver.get("https://selenium.dev");

5.2 浏览器的前进,后退,刷新

// 前进
driver.navigate().back();
// 后退
driver.navigate().forward();
// 刷新
driver.navigate().refresh();

六,弹窗

6.1 警告弹窗+确认弹窗

(警告弹窗)

(确认弹窗)

Alert alert = driver.switchTo.alert();
//确认
alert.accept();
//取消
alert.dismiss();

6.2 提示弹窗

Alert alert = driver.switchTo.alert();
alert.sendKeys("hello");
alert.accept();
alert.dismiss();

七,小结

这部分难度到不是很大,但是熟练掌握也需要下功夫哦,大家一定要勤敲代码哦,我感觉我的房子应该是找好了,诶,明天再去看一看应该就直接签了。第一次租房有点激动捏