Skip to content

App弹窗异常处理

app 弹窗异常处理

简介

在 app 自动化测试中,弹窗异常处理是指处理应用程序中可能出现的各种弹窗、对话框或提示框等用户界面元素的情况。

这些弹窗可能包括警告、确认、输入框等,它们可能是应用程序的正常行为,也可能是错误或异常的指示。有效的弹窗异常处理是自动化测试稳定性和可靠性的关键组成部分。

使用场景

  • 运行过程中不定时弹框(广告弹窗,升级提示框,新消息提示框等等)
  • 弹框不是 BUG(UI 界面提示,警告的作用)

操作步骤

黑名单处理

二次封装查找元素方法。在使用原生方法查找元素的基础上,使用 try except 捕捉异常。在异常处理的逻辑中处理可能出现的弹窗元素。

Python 示例:

# 黑名单
black_list = [
    (AppiumBy.XPATH, "//*[@text='确定']"),
    (AppiumBy.XPATH, "//*[@text='取消']")
]

# 在基类中封装查找元素的方法
class BasePage:

    def __init__(self, driver: WebDriver=None):
        self.driver = driver

    def find(self, by, locator):
        '''
        查找元素,返回元素
        :param by: 定位方式
        :param value: 元素定位表达式
        :return: 定位到的元素对象
        '''
        try:
            return self.driver.find_element(by, locator)
        except Exception as e:
            for black in black_list:
                eles = self.driver.find_elements(*black)
                if len(eles) > 0:
                    eles[0].click()
                    return find(by, locator)
            raise e

Java 示例:

public class BasePage {
    protected static AndroidDriver driver;
    protected List<By> blackList;

    public BasePage(AndroidDriver driver, List<By> blackList) {
        BasePage.driver = driver;
        this.blackList = blackList;
    }

    @BeforeAll
    public static void setUp() throws MalformedURLException {
        DesiredCapabilities caps = new DesiredCapabilities();
        URL remoteUrl = new URL("http://127.0.0.1:4723");
        driver = new AndroidDriver(remoteUrl, caps);
    }

    @AfterAll
    public static void tearDown() {
        if (driver != null) {
            driver.quit();
        }
    }

    public WebElement findElementBy(By by) {
        try {
            return driver.findElement(by);
        } catch (Exception e) {
            for (By black : blackList) {
                List<WebElement> elements = driver.findElements(black);
                if (!elements.isEmpty()) {
                    elements.get(0).click();
                    return findElementBy(by);
                }
            }
            throw e;
        }
    }
}

使用装饰器处理异常

装饰器优势
  • 对原有函数的功能增强。
  • 不改变原有函数的逻辑。
  • 使代码更简洁、易维护。
代码实现
black_list = [
    (AppiumBy.XPATH, "//*[@text='确定']"),
    (AppiumBy.XPATH, "//*[@text='取消']")
]

# 传入的 fun 相当于 find(self, by, value): 方法
def black_wrapper(fun):
    def run(*args, **kwargs):
        # basepage 相当于传入的第一个参数 self
        basepage = args[0]
        try:
            logger.info(f"开始查找元素:{args[2]}")
            return fun(*args, **kwargs)
        except Exception as e:
            logger.warning("未找到元素,处理异常")
            # 遇到异常截图
            # 获取当前工具文件所在的路径
            image_path = basepage.screenshot()
            # 保存页面源码
            pagesource_path = basepage.save_page_source()

            # 遍历黑名单列表,处理可能出现的弹窗
            for b in black_list:
                # 设置隐式等待时间为 1 s
                basepage.set_implicitly_wait()
                #  查找黑名单中的每一个元素
                eles = basepage.driver.find_elements(*b)
                if len(eles) > 0:
                    # 点击弹框
                    eles[0].click()
                    # 恢复隐式等待设置
                    basepage.set_implicitly_wait(15)
                    # 继续查找元素
                    return fun(*args, **kwargs)
            logger.error(f"遍历黑名单,仍未找到元素,异常信息为 ====> {e}")
            raise e
    return run
装饰元素查找方法
class BasePage:

    def __init__(self, driver: WebDriver=None):
        self.driver = driver

    @black_wrapper
    def find_ele(self, by, value):
        '''
        查找元素,返回元素
        :param by: 定位方式
        :param value: 元素定位表达式
        :return: 定位到的元素对象
        '''
        ele = self.driver.find_element(by, value)
        return ele

总结

  • 黑名单处理
  • 异常处理装饰器