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
总结
- 黑名单处理
- 异常处理装饰器