黑名单处理
运行过程中不定时弹框(广告弹窗,升级提示框,新消息提示框等等)
弹框不是 BUG(UI 界面提示,警告的作用)
一、异常弹窗展示
二、黑名单处理流程:
三、黑名单处理代码:
在执行自动化测试过程中,当通过find方法去查找某一个元素的时候,如果异常弹窗出现,会出现找不到元素的异常,这时需要将关闭弹窗的定位元素加入到黑名单black_list列表中。
通过try…except,如果找不到要定位的元素,遍历黑名单列表,判断是否有异常元素,如果有异常元素,关闭掉;紧接着继续去找业务元素,如果业务元素还是没有找到,则继续遍历黑名单中的元素,并且关闭掉;如果当黑名单中元素遍历完后,还是没有找到业务元素,则说明是没有找到元素,会报NoSuchElement报错。
def find(self,by,locator):
try:
return self.driver.find_element(by,locator)
except Exception as e:
print('没有找到元素,处理异常')
for black in self.black_list:
#查找黑名单中的每一个元素
elements=self.driver.find_elements(*black)
if len(elements)>0:
elements[0].click()
return self.find(by,locator)
#todo 遍历完黑名单之后,如果仍然没有找到元素,就抛出异常
raise e
四、装饰器优势
对原有函数的功能增强
不改变原有函数的逻辑
使代码更简洁、易维护
class BasePage:
def __init__(self,driver=None): #加WebDriver代码就有提示了
self.driver=driver
@black_wrapper
def find(self,by,locator):
return self.driver.find_element(by, locator)
find方法传递给装饰器black_wrapper(func),也就是说装饰器中的func表示find方法。
find方法中的参数self,by,locator传递给装饰器中的run方法中的 *args
self可以通过self = args[0]获取
import time
import logging
import os
import allure
from appium.webdriver.common.appiumby import AppiumBy
# todo 黑名单列表
black_list = [(AppiumBy.ID, "com.xueqiu.android:id/ib_close")]
# todo func相当于find方法
def black_wrapper(func):
def run(*args, **kwargs):
from base.base_page import BasePage
basepage:BasePage = args[0]
try:
logging.info(f"开始查找元素{args[2]}")
return func(*args, **kwargs)
except Exception as e:
logging.warning("为找到元素,处理异常")
# 以当前时间命名的截图
curtime=basepage.get_time()
tmp_name=curtime+'.png'
#todo 获取当前文件black_handle.py所在的路径
# os.path.dirname(__file__)
# 上一级路径与当前路径进行拼接
tmp_name=os.path.join(os.path.dirname(__file__),'..','images',tmp_name)
logging.info(f"当前截图的路径为————————》:{tmp_name}")
basepage.screenshot(tmp_name)
#todo 截图添加到测试报告中
allure.attach.file(tmp_name,
name="截图",
attachment_type=allure.attachment_type.PNG)
for black in black_list:
# 查找黑名单中的每一个元素
logging.warning(f"处理黑名单:{black}")
elements = basepage.driver.find_elements(*black)
if len(elements) > 0:
elements[0].click()
return func(*args, **kwargs)
# todo 遍历完黑名单之后,如果仍然没有找到元素,就抛出异常
logging.error(f"遍历黑名单,仍然未找到元素信息————》{e}")
raise e
return run