(七)PC自动化测试框架之自定义框架介绍(四)--智能等待(java)

玩自动化的都知道,很多操作都需要在页面元素加载完成才可以去操作,但是这个加载速度是我们无法预料的,所以智能等待就派上用场了,不需要浪费多余的时间来等待,一旦元素加载出来,即可进行下一步的操作。当然使用强制等待也是可以的sleep(),只是效率低了一些。

1:强制等待(这个方法有好处有坏处,下面会具体说明)

Thread.sleep():固定休眠时间设置,Java的Thread类里提供了休眠方法sleep,导入包后就能使用
Thread.sleep(3000);毫秒为单位,即等待3秒后,执行下一步。

  • 坏处:

设置的等待时间,不一定下一步的元素已加载,如果未加载完成,等待了3秒,则下一步操作会抛异常,因为元素没找到;如果加载完成,等待了3秒,那就浪费这3秒时间。别小看这3秒,如果多个步骤多个用例都这样强制等待,那会浪费很多时间的。

  • 好处:
    了解智能等待的,可能会嫌弃这个方法,但是在某种情况下,它还是有必要的,举例:
    一:A页面和B页面都有同一个相同的目标属性值,那么当你从A页面跳转到B页面的时候,只使用智能等待的时候,那么很可能是直接操作A页面,而不是B页面。所以这里加一个强制等待,让A页面确实跳转到B页面了,再进行下一步的操作。
    二:A页面存在一个目标元素element1,这个元素也加载完了,但是element1是依赖另一个元素element2,只能操作了element2,才能点击element1,进行下一步,但是当你操作了element2,可能页面数据还没加载完,这个时候点击element1还是无效的,只能等点击element2且加载完成才可以点击element1,所以在这个间隙,也需要加一个强制等待。

这样举例,大家能明白了吗?所以大家要结合着显性等待和强制等待使用。

2:显性等待(等待页面元素加载完成再执行)

这里就结合我上几篇提到的框架来使用,就这一句就够了。

WebElement element = (new WebDriverWait(dr,20)).until(ExpectedConditions.presenceOfElementLocated(locator));

比如下面的点击操作,先判断是否存在,存在则进行下一步点击操作,不存在则直接抛异常,停止下面的操作。

	public static void activate(By locator) throws Exception {
		try {
			WebElement element = (new WebDriverWait(dr,20)).until(ExpectedConditions.presenceOfElementLocated(locator));
			dr.findElement(locator).click();
		} catch (Exception e) {
			UserFunction.screenShotSpecial();
			dr.close();
			throw new Exception("对不起,该元素未抓取到,请您查看当前页面元素位置是否有变动!");
		}
	}

点击方法的封装,见另一篇博客:https://blog.csdn.net/weixin_43574761/article/details/89096669

说明
1:dr 是驱动缩写
2:在20秒内去定位locator元素是否存在,如果存在就直接进行下一步的操作,如果等待了20s还不存在,则直接报错。
3:new WebDriverWait(dr,20,0.5)其实这里还有一个默认值0.5,意味着每500毫秒会去检查一下目标元素是否存在。

这里使用的是presenceOfElementLocated这个条件,其它支持的方法如下,根据自己的需要使用。

等待的条件 WebDriver方法
页面元素是否在页面上可用和可被单击 elementToBeClickable(By locator)
页面元素处于被选中状态 elementToBeSelected(WebElement element)
在页面元素中是否包含特定的文本 textToBePresentInElement(By locator)
页面元素在页面中存在 presenceOfElementLocated(By locator)
页面元素值 textToBePresentInElementValue(By locator, java.lang.String text)
标题 (title) titleContains(java.lang.String title)

3:隐性等待(这个我暂时没用)

但是了解下来,这个方法是全局设置,不需要定位具体的元素。
implicitlyWait()方法比sleep()方法智能,sleep()方法只能在一个固定的时间等待,而implicitlyWait()可以在一个时间范围内等待,称为隐式等待
隐式等待采用全部设置,也就是说,你所有的findElement方法都会隐式等待10s
driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS);即对执行脚本的所有对象,都执行等待10秒,在测试用例首部,添加一次即可。

注意:显示和隐式最好不要混用,混用的话可能会造成不可预估的等待时间,比如说设置了隐式等待10s,显示等待15s,可能在20s后就会发生超时

有疑问的加V了解详情:zx1187463903
如果你也搞定了,开心的同时请小编喝个咖啡也极好的呀。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43574761/article/details/89521528