如何解决appium 自动化无法获取悬浮窗问题

    事情的起因是在两个项目上,A项目的虚浮窗按钮无法获取

B项目的推荐和看动态无法获取UI元素

 

通过adb shell dump也是无法获取到,但就一个问题,为啥weditor可以定位到呢?

 

 

那奇怪了是什么原因?为什么会突然有这个现象呢?因为我们是用weditor录制脚本,然后用appium执行,appium通过http请求的response和打印的日志,都是没有获取到相关元素。


    经过对比实验,是ui2的问题,weditor的atx ui2是有修改过的。所以就安排开始看ATX ui2项目,进行定位,并对appium的UI2进行修改,最终搞定。appium自动化框架都可以识别到,解决了悬浮窗popwindow这类节点定位不到的问题。

    

    ATX 和appium获取当前Android设备上所有可访问窗口的根节点元素区别:
ATX 代码:(简称A)

 

appium 代码(简称B)

 

这两段代码都是获取当前Android设备上所有可访问窗口的根节点元素,但是实现方法不同,具体不同如下:
共同之处:

1.都是获取当前Android设备上所有可访问窗口的根节点元素;

2.都是通过AccessibilityService的相关方法实现的;
不同之处:

1.A代码是在获取根节点元素时使用了XML序列化,并将序列化结果存储到ByteArrayOutputStream中,然后再将其转换为InputStream返回;

2.A代码是直接获取所有窗口的根节点元素,而B代码则有选择地获取所有窗口或者只获取活动窗口的根节点元素;

3.A代码不涉及缓存,每次调用都会重新获取根节点元素,而B代码则通过缓存来优化性能,如果缓存中已经存在获取到的窗口根节点元素,则直接返回缓存中的结果;

所以整体appium获取不到元素的原因在于不同之处的第2和第3点,实时获取根节点元素以及获取的方式,修改的地方很多,但可以根据ATX的ui2来修改;

以上,就是关于解决appium 无法获取PopWindow 悬浮窗问题,当然获取不到,还可以用图像识别,但不在本次的讨论范围~

注:也有人说通过设置 relaxedSecurity 为 true 可以访问应用程序的上下文,包括悬浮窗 PopWindow,因此这项配置可以解决无法获取悬浮窗 PopWindow 的问题。但是需要注意,这个设置可能会影响测试的安全性,因此应该谨慎使用,并在测试完成后将其重置为默认值。我是没验证过~


    如果需要已编译好的appium-uiautomator2-server apk,请加微信:Dark_Angel168 或者扫描,备注获取apk包,也可关注“测试一般不一般”订阅号,后台回复“ui2获取下载链接;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要使用appium自动化获取图片验证码,可以按照以下步骤进行操作: 1. 导入所需的库和类: - import time:用于生成唯一的文件名。 - from common.image_recognition import ImageRecognition:用于图像识别。 - from page.base_page import BasePage:用于页面的基本操作。 2. 创建一个名为Screen的类,并继承BasePage类。 3. 在Screen类中定义一个名为_get_part_screen(self)的方法,用于截取页面中特定区域的验证码图片,并保存至指定的文件夹中。 4. 在_get_part_screen方法中,定义图片验证码输入框的定位路径。 5. 设置截取的图片保存位置和文件名,可以使用时间戳来生成唯一的文件名。 6. 使用appium提供的方法,如find_element_by_xpath()来定位并截取特定位置的图片,并保存在指定的位置和文件名。 7. 实例化ImageRecognition类,传入需要识别的图片位置。 8. 调用ImageRecognition类的ocr()方法,进行图像识别,并获取识别结果。 下面是一个示例代码,其中包含了以上步骤的实现: import time from common.image_recognition import ImageRecognition from page.base_page import BasePage class Screen(BasePage): _img_check_code = "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.FrameLayout/android.webkit.WebView/android.webkit.WebView/android.widget.Image" def get_part_screen(self): # 截图将图片保存至固定的位置 img_folder = 'E:\\study\\Fork\\Weibo_Demo\\Weibo\\image\\' times = time.strftime('%Y%m%d%H%M', time.localtime(time.time())) screen_save_path = img_folder + times + '.png' self.find_element_by_xpath(self._img_check_code).screenshot(screen_save_path) # 实例化ImageRecognition,传入需要识别的图片位置 ir = ImageRecognition(screen_save_path) result = ir.ocr() return result 请注意,以上代码仅为示例,具体的实现可能会因应用的特定情况而有所不同。您可能需要根据您的应用程序的实际情况进行适当的调整和修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

测试一路到黑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值