软件测试--【自动化测试常用函数】(下) - 教程

           这篇博客,我们将对自动化测试常见的函数进行收尾,内容同样重要。

目录

1.等待

1.1强制等待Thread.sleep()

1.2隐式等待

1.3显示等待

2.浏览器导航

2.1打开网址

2.2浏览器的前进、后退、刷新

3.弹窗

3.1 警告、确认弹窗

3.2提示弹窗

4.文件上传

5.浏览器参数设置


1.等待

首先我们看下面这段代码,我们通过自动化在百度浏览器上搜索迪丽热巴并在迪丽热巴界面搜索相关元素,这时候我们发现报错了,报错原因显示元素无法定位到,但是通过我们手动查找发现我们的xpath可以定位到元素,这是为什么呢?

我们对代码进行修改一下:

我们加了一个强制等待方法Thread.sleep()后代码就运行成功了,这是为什么?

通常代码执行的速度比页面渲染的速度要快,这就会出现因为渲染过慢出现的自动化误报的问题。因此我们可以添加强制等待操作给页面一个渲染的时间。

假如写自动化代码出现了NoSuchElement错误:

第一步:在报错的代码前添加Thread.sleep(秒),设置时间长一点

第二步:执行自动化,在自动化打开的页面里打开前端开发者工具,手动检查元素是否真的不存在,这时候会出现两种情况:

(一)自动化打开的界面确实不存在该元素:

1.手动打开的界面和自动化打开的界面不一样(登录状态不同导致的)

2.该元素为动态元素,无法直接定位该元素,可以通过定位该元素的前一级标签再增加要定位元素的元素标签

(二)自动化打开的页面确实存在该元素

代码的执行速度比页面的渲染速度要快,页面还没有渲染出来,程序已经开始找了,导致元素没有找到,可以通过添加等待解决

这就正式引出我们的等待,selenium中提供的三种等待方法:

1.1强制等待Thread.sleep()

优点:使用简单,调试的时候比较有效

缺点:影响运行效率,浪费大量的时间

1.2隐式等待

隐式等待是一种智能等待,他可以规定在查找元素时,在指定时间内不断查找元素。如果找到则代码继续执行,直到超时没找到元素才会报错。

那么什么是智能等待呢?我们可以对比强制等待:强制等待相当于必须等待够要求时间,即使提前查找到元素也不会继续执行/智能等待则是在要求时间内只要查找到元素就不会再等待了,继续执行。

implicitlyWait() 参数:Duration类中提供的毫秒、秒、分钟等方法

//隐式等待1000毫秒
driver.manage().timeouts().implicitlyWait(Duration.ofMillis(1000));
//隐式等待5秒
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));

这里我们通过隐式等待5秒查找元素,但是可以发现我们运行后甚至连页面都没有看清代码就执行完成了,这是因为页面还没渲染出来我们的隐式等待就敏锐的查找到元素并执行下去了。

隐式等待作用域是整个脚本的所有元素。即只要driver对象没有被释放掉(driver.quit()),隐式等待就一直生效。

优点:智能等待,作用于全局

那么他有什么缺点吗:

我们看这段代码,我们先搜索迪丽热巴,在迪丽热巴页面搜索某一元素,然后清空输入框重新搜索邓紫棋,并在邓紫棋页面搜索同一元素,最后打印搜索出的元素,发现不是邓紫棋是迪丽热巴,这是为什么呢?

原因就在于隐式搜索只用来查找元素是否存在,但是搜索的却不一定对,我们搜索同一元素它们的xpath相同,所以返回了先搜索到的迪丽热巴,解决方法也很简单,依旧是添加一个等待

1.3显示等待

显示等待也是⼀种智能等待,在指定超时时间范围内只要满足操作的条件就会继续执行后续代码 new WebDriverWait(driver, Duration.ofSeconds(3)).until($express)

$press:涉及到selenium.support.ui.ExpectedConditions包下的ExpectedConditions类,返回值:boolean

WebDriverWait foo = new WebDriverWait(driver, Duration.ofSeconds(3))
foo.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#id")));

优点:显示等待是智能等待,可以自定义显示等待的条件,操作灵活

缺点:写法复杂

那么既然隐式等待和显示等待都是智能等待,那么他们一起使用会怎么样呢

我们会发现结果并不是相差15秒,因此混合隐式和显式等待,可能会导致不可预测的等待时间。

2.浏览器导航

2.1打开网址

// 更⻓的⽅法
driver.navigate().to("https://selenium.dev");
// 简洁的⽅法
driver.get("https://selenium.dev");

2.2浏览器的前进、后退、刷新

driver.navigate().back();
driver.navigate().forward();
driver.navigate().refresh();

3.弹窗

常见的弹窗有三种,警告、确认、提示弹窗

弹窗是在页面找不到任何元素的:这种情况怎么处理?使用selenium提供的Alert接口:

弹窗的操作一般有:切换弹窗、点击确认、点击取消、输入文本信息

3.1 警告、确认弹窗

我们会发现这两种弹窗很简单,只有按钮确定、取消:switchTo用于切换弹窗

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

3.2提示弹窗

这种弹窗需要我们填写一些内容,同样输入我们可以通过sendKeys方法

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

4.文件上传

有一种特殊的窗口操作需要提交文件:点击文件上传的场景下会弹窗系统窗口,进行文件的选择。 selenium无法识别非web的控件,上传文件窗口为系统自带,无法识别窗口元素 但是可以使用sendkeys来上传指定路径的文件,达到的效果是一样的。

WebElement ele = driver.findElement(By.cssSelector("body > div > div >
input[type=file]"));
ele.sendKeys("D:\\selenium2html\\selenium2html\\upload.html");

5.浏览器参数设置

我们在最开始尝试编写自动化程序时,就用到过浏览器参数设置:

还有一种为设置无头模式(浏览器默认为有头模式)

工作中,运行自动化不会人工一直盯着自动化执行效果,一般都是设置成无头模式,通过自动化执行结果来分析。

posted on 2026-02-06 22:27  ljbguanli  阅读(0)  评论(0)    收藏  举报