iOS UI自动化测试之元素定位增加灵活等待时间

刚接手iOS平台自动化建设工作一年,习惯了Android平台的框架的高效,一开始很不习惯,当然,慢慢就习惯了,也拿Android的一些经验来适配到 iOS 中。

闲话少说,直奔主题,就我目前了解到了,iOS 在定位元素 和 操作元素时,如果元素未能完全刷新出来,获取到的对象是不能够操作的,当然了,这是废话,获取到的元素信息不完整的话,当然不可以进行操作。

除了固定增加等待时间外,还可以通过什么方法规避这些问题,我也没有什么特牛X的方法,只是增加灵活等待时间?是不是很失望。。。

iOS UI自动化中关于元素定位增加灵活等待时间

这里是以 Appium 框架为例,介绍如何增加灵活等待:

一、获取元素,捕获异常

我们当然不希望获取元素失败就中断用例执行了,如果失败,我们做一些额外的判断,直到我们认定这就是失败了。

代码(脚本语言,当然 Python 优先)

def Element(Type,id):
# Type 通过什么属性定位元素
# id 属性值
    try:
        if Type == 'name':
            elements = ind_elements_by_name(id)
            if len(elements) > 0:
                return elements[0]
            else:
                return None
        elif Type == 'id':
            return Driver.find_element_by_id(id)
        elif Type == 'xpath':
            return Driver.find_element_by_xpath(id)
        elif Type == 'class':
            return Driver.find_element_by_class_name(id)
    except NoSuchElementException as HT:
        return None

二、判断元素获取是否为None

主要是规避有的页面有固定动画,需要动画结束后才可以成功定位元素的场景(当然,这种情况,通过增加固定等待时间也是很有效的方法)

代码

count = 4 # 灵活等待时限 count * 0.5
sleepTime = 0.5 # 间隔多长时间 去Check 一次
Target = Element('id', id_Value)
'''
第一步,判断元素存不存在
'''
Wait_Elements = Target == None
i = 0
while Wait_Elements:
    sleep(sleepTime)
    Target = Element('id', id_Value)
    Wait_Elements = Target == None
    if i >= count:
        Wait_Elements = False
    i += 1
'''
如果第一步失败,则中断当前用例,抛出异常
'''
AssertTrue(Target == None, 'Type:id ,can not get element,Please check ID value:' + id)

三、判断元素是否支持后续操作

目前碰到的问题时,个别元素,预期是支持操作的,但开始获取到的元素不支持操作,需要等待 不等时间后正常

代码

count = 4 # 灵活等待时限 count * 0.5
sleepTime = 0.5 # 间隔多长时间 去Check 一次
Target = Element('id', id_Value)
'''
第二步,判断元素是否支持点击
'''
Go = Target.is_enabled()
j = 1
while (not Go):
    sleep(Sleep_Time)
    Target = Element('id', id_Value)
    Go = Target.is_enabled()
    if j >= count:
        Go = True
    j += 1

'''
如果第二步失败,则中断当前用例,抛出异常
'''
AssertTrue(not Target.is_enabled(), 'Type:id ,is not enabled:' + id)

四、判断元素是否在当前页面可见

这个还没来得及充分验证,但先在这里加一下

问题:获取到的元素,上面验证都通过了,但不在当前页面展示

代码(这里只验证了一个点,后续碰到了陆续补充)

'''
第三步,判断元素是否在当前屏幕展示
'''
if Target.rect['y'] > Height # 获取屏幕分辨率高度:
    '''
    如果第三步失败,则中断当前用例,抛出异常
    '''
    AssertTrue(True, 'Element By id ,is not visible,id:' + id)

五、没了,凑5步好看

那就介绍下 AssertTrue() 方法,这里是在封装了判断方法,条件为 True 时,执行截图、日志整合打印的操作,具体就不介绍了



留言