🔔 Appium iOS 针对弹框处理

问题:

在元素定位时,抛出 UI 未加载完成前导致的定位失败,大部分的 UI 定位失败原因。除非代码有问题,绝大多数的失败,就是各种各样的弹框,导致的失败。

思路:

在元素定位时,设置预期最长等待的时间段,在此时间段内,循环定位元素,如果查找到匹配元素,则返回对象,中断循环,如果元素未定位,则尝试去定位设置好的预期的弹框/异常对象,如果匹配到元素,则处理掉,然后继续查找预期元素,直到定位成功或者超时报错。

实现

1)提前设置好可能存在弹框,我这里是用 yaml 文件记录的,区分了授权弹框 和 异常的弹框(因为我们的 App 的异常都是用弹框的形式来提示用户的)

permission:
  - Type: id # 定位异常元素的属性类型
    Value: 'cmbc close'  # 定位异常元素的属性值
    ClickType: id# 定位成功后,点击位置的元素的属性类型
    ClickValue: 'cmbc close' # 定位成功后,点击位置的元素的属性值

APP:
  - Type: id
    Value: '未知异常'
    ClickType: xpath
    ClickValue: '//XCUIElementTypeButton[@name="确定"]'

2)元素定位方法封装,这里只写了个 demo,未完善各种异常捕获,细节逻辑处理等


def find_element(driver, type, value):
    time_out = 10  # 最长时间10秒
    end_time = time.time() + time_out
    while end_time > time.time():
        element = driver.find_element(type, value)
        if isinstance(element, WebElement):
            LogSys.logInfo('assert is_enabled&is_displayed')
            if element.is_enabled() and element.is_displayed():
                return element
        for item in Config.permission:
            Target = driver.find_element(type=item['Type'], value=item['Value'])
            # 处理掉弹框
            if isinstance(Target, WebElement):
                LogSys.logInfo("命中弹框,处理掉弹框后,再执行一遍findUiObject方法")
                Alert.alertAccept()
                Config.permission.remove(item)
                LogSys.logWarning(Config.permission)

        for item in Config.app:
            Target = driver.find_element(type=item['Type'], value=item['Value'])
            # 处理掉弹框
            if isinstance(Target, WebElement):
                LogSys.logInfo("命中弹框,处理掉弹框")
                driver.find_element(type=item['ClickType'], value=item['ClickValue']).click()

    SetFail("预期时间内,未定位到元素",'pic_name')


↙↙↙阅读原文可查看相关链接,并与作者交流