UI自动化测试框架搭建 —— 添加Template方式定位元素

1509 篇文章 70 订阅
1438 篇文章 114 订阅

点击关注,我们共同每天进步一点点!

由于Airtest的Template类中包含了大量的自身框架的内容,所以需要将它拿出来与我们的框架进行整合。

解耦框架部分内容

from airtest.core.helper import G

G中封装了driverlogger等对象

我们需要将他变为我们自己的driverlogger等对象

from airtest.core.settings import Settings as ST

Settings中放了一些常量,变更不大,直接采用硬编码来进行替换

from airtest.core.error import TargetNotFoundError, InvalidMatchingMethodError

重写了几个异常,基本上的操作就是改了个名字,直接拷贝过来就行了

# 图片比对算法
MATCHING_METHODS = {
    "tpl": TemplateMatching,
    "mstpl": MultiScaleTemplateMatchingPre,
    "gmstpl": MultiScaleTemplateMatching,
    "kaze": KAZEMatching,
    "brisk": BRISKMatching,
    "akaze": AKAZEMatching,
    "orb": ORBMatching,
    "sift": SIFTMatching,
    "surf": SURFMatching,
    "brief": BRIEFMatching,
}

这里面是几个图片比对算法,看了一下基本上只需要使用cv就行了,直接导入使用即可

修改后的文件见

  • src/utils/picoperator.py

  • src/utils/error.py

  • src/utils/cvtools.py

整合入当前框架

src.utils.elementoperator.ElementOperator._get_locator_tuple中增加一个定位方式Template

@staticmethod
def _get_locator_tuple(locator):
    type_dict = {
        "id": By.ID,
        "xpath": By.XPATH,
        ...
        "Template": Template
    }
    locator_t = (type_dict[locator.by_type], locator.element)
    return locator_t

修改_get_element方法,当我们定位使用Template的时候改变定位方式

if locator_t[0] != Template:
    web_element = self.driver.find_element(*locator_t)
else:
    web_element = self.loop_find(Template(**eval(locator_t[1])))

见一条yaml中的Template对象

type是Template

value是Template对象的实例化参数

通过Template(**eval(locator_t[1]))就可以进行解包和入参了

- { desc: "挂号img",type: "Template",value: '{"filename":f"{DATA_PATH}/img/挂号icon.png","record_pos":(-0.356, 0.207),"resolution":(1080, 2400)}',timeout: "10", name: "registered_img" }

封装loop_find方法:

  1. 截取当前页面图片

  2. 使用match_in比较图片

  3. 拿到目标图片在截图的坐标位置

def loop_find(self, query):
    file_name = os.path.join(TEST_PIC, f'{str(int(time.time() * 1000))}.png')
    self.screenshot_pic(file_name)
    screen = imread(file_name)
    if screen is None:
        logger.warning("截图失败")
    else:
        match_pos = query.match_in(screen)
        if match_pos:
            return match_pos

修改click方法

使用Template定位拿到的对象是个坐标点,所以使用tap或者move_by_offset去操作

if isinstance(ele, tuple):
    if isinstance(self.driver, app_webdriver.Remote):
        self.driver.tap([ele], 500)
    else:
        ActionChains(self.driver).move_by_offset(*ele).click().perform()

使用

编写一个测试用例测试一下

@compose(feature="微医APP", story="首页", title='点击问诊图片')
def test_home_android_click_img(home_android):
    """
    点击问诊图片
    """
    time.sleep(10)
    home_android.click(home_android.registered_img)
    print("test")

查看日志打印

2022-04-07 17:05:32,099| 【DEBUG】| wytest  | try match with MultiScaleTemplateMatchingPre
[17:05:32][DEBUG]<airtest.aircv.multiscale_template_matching> [MSTemplatePre] threshold=0.7, result={'result': (135, 1442), 'rectangle': ((44, 1339.56), (44, 1544.56), (227, 1544.56), (227, 1339.56)), 'confidence': 0.4374358654022217}
[17:05:32][DEBUG]<airtest.aircv.utils> find_best_result() run time is 0.12 s.
2022-04-07 17:05:32,220| 【DEBUG】| wytest  | try match with TemplateMatching
[17:05:32][DEBUG]<airtest.aircv.template_matching> [Template] threshold=0.7, result={'result': (171, 506), 'rectangle': ((91, 416), (91, 597), (252, 597), (252, 416)), 'confidence': 0.9995594620704651}
[17:05:32][DEBUG]<airtest.aircv.utils> find_best_result() run time is 0.15 s.
2022-04-07 17:05:32,370| 【DEBUG】| wytest  | match result: {'result': (171, 506), 'rectangle': ((91, 416), (91, 597), (252, 597), (252, 416)), 'confidence': 0.9995594620704651, 'time': 0.14921331405639648}

发现一个匹配程度为0.9995594620704651的对象,它的坐标为(171, 506)

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走


这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。希望对大家有所帮助……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值