Appium appium factory 如何使用显示等待

· 2017年06月21日 · 最后由 回复于 2017年07月04日 · 3400 次阅读

最近做 UI 自动化引用了 appium pageobejct 思想 ,使用 PageFactory 来初始化页面对象进行测试执行, 但是遇到了一个问题, 就是如何去显式等待一个元素呢?.

在此之前, 在 UI 自动化中都是自己写了一个 wait 方法和封装了一个 findElement 方法, 在指定时间内去寻找元素, 若找到元素则立即响应, 超出等待时间则抛出异常, 但是这种方法所需要传入的参数是 By locator, 即页面的元素定位信息 (比如一个 button 按钮的 id\class\xpath 等信息), 而非页面元素信息 (比如一个 button 按钮本身).

如果在 PageFactory 中使用这种方式去显示等待, 那我觉得就没必要使用 PageFactory 去初始化页面对象了, 会有很多重复的元素信息. 所以想请教大神, 是如何在 PageFactory 中使用显式等待一个元素呢.

共收到 2 条回复 时间 点赞

个人肤浅的理解,理解错误请轻喷
@ 显式等待应该就是强制等待多少秒后再进行 find,找到了进行操作,找不到直接报错,你所说的 在指定时间内去寻找元素, 若找到元素则立即响应, 超出等待时间则抛出异常 这个应算隐式等待吧

@在此之前, 在 UI 自动化中都是自己写了一个 wait 方法和封装了一个 findElement 方法, 但是这种方法所需要传入的参数是 By locator, 即页面的元素定位信息 (比如一个 button 按钮的 id\class\xpath 等信息), 而非页面元素信息 (比如一个 button 按钮本身). -->我个人感觉你的说法是矛盾的,UI 自动化去寻找元素都是靠 element 去找的,也就是你说的 id/xpath 这些东西,不晓得你所谓的一个 button 按钮本身指的是什么

@ 还有最后一个 pagefactory,为什么会有很多重复的元素信息呢?你不会认为页面上假如全是按钮,你就认为是同一个元素 (按钮) 吧,pagefactory 是靠注解@FindBy来定义 webelement,初始化一下,就相当于已经使用了 driver.findelement(By.xxx()) 了,这样写测试用例的时候会很简洁

#2 · 2017年07月04日 Author
shishuaigang 回复

针对你的三点进行答复:

  1. 这一点你可能对显示和隐式等待理解的有些偏差。我说的显示等待即类似 selenium 中的 WebDriverWait(),即在设置时间内,默认每隔一段时间检测一次当前。页面元素是否存在,如果超过设置时间检测不到则抛出异常,如果元素存在则立即反馈。隐式等待就是 implicitly_wait(),它的意思就是加入元素没有马上加载出来会默认等待设定的时间然后再作出反馈,会延迟全局查找元素的时间
  2. 第二点,我说的元素本身其实就是已经通过 locator 初始化成功(通过 pagefactory 或者 findElement)之后的 AndroidElement 元素,如果元素存在初始化肯定是成功的,如果元素不存在则会初始化失败抛出 nosuchelement 的一个异常
  3. 我所说的重复元素信息就是指比如界面上有一个 button 元素,按照我说的既有@Findby又有 By 定义的,如同下方所写,比较冗余的意思
@AndroidFindBy(id = "button")
@FindBy(id = "button")
private AndroidElement button;
private By button_by = By.id("button");

另:我查了官方的 pagefactory 文档说明,也没有任何 的显示等待方法,只是有一种更加 “智能” 的隐式等待,即针对某些特定元素设置特定的隐式等待时间,如下方,而隐式等待实际的长短肯定会影响 case 的执行效率,所以还是一个比较慎重的考虑,最好是有能够像 WebDriverWait() 类似的显示等待可以立即反馈。

@AndroidFindBy(id = "button")
@FindBy(id = "button")
@WithTimeOut(time=5000, unit=TimeUnit.MILLISECONDS)
private AndroidElement button;

关闭了讨论 08月08日 09:56
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册