APP自动化之三大等待(四)
硬性等待
Thread.sleep(long millis);
实例:
Thread.sleep(1000); 1秒
优点:使用简单
缺点:容易造成时间浪费
隐式等待
在设置的超时时间范围内不断查找元素,直到找到元素或者超时 如:设置等待时间为5秒,在第3秒找到元素,不再继续等待
设置方式
driver.manage.timeouts().implicitlyWait(long time, TimeUnit unit);
实例:
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
优点:相对灵活
缺点: 设置是针对全局的,在WebDriver实例整个生命周期有效,但并不是所有的元素都需要等待。
不能适用条件更复杂的情况,如:元素可点击、元素可见
显式等待
显式等待通常是我们自定义的一段代码,用来等待某个条件发生后再继续执行后续代码(如找到元素、 元素可点击、元素已显示等)
使用方式:
WebDriverWait wait = new WebDriverWait(); WebElement element = wait.until(expectCondition);
优点: 每隔一段时间扫描一次页面,检查元素是否满足等待结果条件,比如查找元素,则检查元素是否存在, 不存在则继续等待,直到找到或超时。 该方式不是全局设置,因此特定需要等待的元素可以这样处理,推荐优先使用这一种方法。
显式等待实例:
1、实例化WebdriverWait对象 (设置显示等待的超时时间)
WebDriverWait webDriverWait = new WebDriverWait(driver,5);
2、使用WebdriverWait所提供的until方法(直到某个条件满足时为止)
webDriverWait.until(ExpectedConditions.elementToBeClickable(MobileBy.id("com.apple.apple2:id/navigation_shopping"))).click();
WebElement webElement1 = webDriverWait.until(ExpectedConditions.elementToBeClickable(MobileBy.id("com.apple.apple2n:id/button_go_login")));
webElement1.click();
等待手机号码输入框可见
WebElement webElement2 = webDriverWait.until(ExpectedConditions.visibilityOfElementLocated(MobileBy.id("com.apple.apple2n:id/et_mobile")));
webElement2.sendKeys("1234345656");
driver.findElement(MobileBy.AccessibilityId("购物车"));
显示等待和隐式等待的区别
- 1、条件方面:
- 隐式等待findElement方法只会等待元素在当前页面中存在 显示等待等待元素可以定制更加丰富的条件:等待元素存在、等待元素可见、等待元素可悲点击
- 2、作用范围:
- 隐式等待设置一次之后就是全局生效 显示等待只能针对特定的元素
- 3、超时异常:
- 隐式等待:NoSuchElementException 显示等待:TimeoutException
- 后面框架设计的时候我们会统一使用显示等待
总结
- 三大等待 Thread.sleep() 隐式等待 显示等待