iOS Test Error: NSArrayM insertObject:atIndex

NSArrayM insertObject:atIndex

环境

原来测试环境:

  • macOS 系统电脑:10.13.6
  • Xcode:13.1
  • Appium Desktop 1.21.0

升级后测试环境:

  • macOS 系统电脑:11.3.1
  • Xcode:13.2

问题描述

  1. 存在一些元素,对于 find_element_by_name(name).click() 不生效
    在这里插入图片描述
  2. 点击app与系统交互的弹框,出现报错
    在这里插入图片描述在这里插入图片描述

排查

首先想从根源找问题原因,尝试重启所有涉及到的设备和服务,没有解决。

发现系统升级后,猜测是当前这个bug应该是系统、Xcode升级引起,考虑修改测试代码,规避报错和点击失效。

原来都是通过 find_element_by_name 找到元素后并点击,现在改成直接点击坐标。

解决思路

  1. 每次点击前,获取 driver 的属性 page_source,在里面检查是否存在name
  2. 如果存在想要找的name,就通过正则匹配到该行数据,解析提取出该元素的坐标
  3. 通过driver 直接点击坐标,来取代 find_element_by_name(name).click() 实现点击元素

针对遇到的问题,用下面代码可以获得想要点击元素的中心点坐标,然后直接点击,可以规避报错、达到点击的效果

def get_element_coordinate(driver, name):
    if hasattr(driver, 'page_source'):
        page_source = driver.page_source
        ret_list = re.findall(f"[<XCUIElementType](.*)({name})(.*)[/>]", page_source)
        if len(ret_list) >= 1:
            name_str = f'name="{name}"'
            element_str_list = [''.join(i) for i in ret_list]
            for element_str in element_str_list:
                if name_str in element_str and 'button' in element_str.lower():
                    x = re.findall(r' x="(\d+)"', element_str)[0]
                    y = re.findall(r' y="(\d+)"', element_str)[0]
                    width = re.findall(r' width="(\d+)"', element_str)[0]
                    height = re.findall(r' height="(\d+)"', element_str)[0]
                    x, y, width, height = [int(i) for i in [x, y, width, height]]
                    ele_coordinate = (x + width / 2, y + height / 2)
                    return True, ele_coordinate
    return False, None
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值