AirtestProject / Airtest

UI Automation Framework for Games and Apps
http://airtest.netease.com/
Apache License 2.0
8.16k stars 1.29k forks source link

在airTest脚本中启动子线程出现异常 #652

Closed pastel001 closed 4 years ago

pastel001 commented 4 years ago

(请尽量按照下面提示内容填写,有助于我们快速定位和解决问题,感谢配合。否则直接关闭。)

(重要!问题分类)

描述问题bug 在airTest脚本中启动子线程,主线程swipe刷新,子线程检查图片,如果出现图片则进行点击。 但是要么手机没有反应,要么出现异常脚本终止。 出现异常脚本终止截图如下: image

Traceback (most recent call last): File "airtest\cli\runner.py", line 65, in runTest File "site-packages\six.py", line 693, in reraise File "airtest\cli\runner.py", line 61, in runTest File "E:\AirtestIDE_2018-07-20_py3_win64\test_threading.air\test_threading.py", line 36, in swipe([456,1355], vector=[0, 0.08],duration=0.01) File "airtest\utils\logwraper.py", line 78, in wrapper File "airtest\core\api.py", line 306, in swipe File "airtest\utils\logwraper.py", line 78, in wrapper File "airtest\core\cv.py", line 97, in try_log_screen File "airtest\core\android\android.py", line 218, in snapshot File "airtest\core\android\minicap.py", line 24, in wrapper File "airtest\core\android\minicap.py", line 340, in get_frame_from_stream ValueError: generator already executing

脚本一直卡主,没有反应,截图如下: image

(在这里粘贴traceback或其他报错信息)

相关截图 (贴出遇到问题时的截图内容,如果有的话) (在AirtestIDE里产生的图像和设备相关的问题,请贴一些AirtestIDE控制台黑窗口相关报错信息)

复现步骤 执行脚本 `# -- encoding=utf8 -- author = "Administrator"

from airtest.core.api import * import threading

ST.FIND_TIMEOUT = 1 ST.FIND_TIMEOUT_TMP = 0.1

auto_setup(file)

connect_device("android:///")

def t1_swipe(): while True: swipe([456,1355], vector=[0, 0.08],duration=0.01)

def t2_check_and_get(): while True: exist = find_all(Template(r"tpl1575165525423.png", threshold=0.96, target_pos=2, record_pos=(0.393, -0.001), resolution=(1080, 1920))) if exist: x = exist[0].get("result")[0] y = [r.get("rectangle")[0][1] for r in exist] y.sort() touch((x,y[0]),2)

t1 = threading.Thread(target=t1_swipe)

t2 = threading.Thread(target=t2_check_and_get)

t1.start()

t2.start()

while True: swipe([456,1355], vector=[0, 0.08],duration=0.01)`

预期效果 期望可以看到脚本一边下拉刷新,一边循环判断是否出现图片,然后点击图片

python 版本: 使用的是IDE内置的python环境,没有在IDE的setting中自定义python.exe的路径

系统环境变量python是2.7.12 C:\Users\Administrator>python --version Python 2.7.12

airtest 版本: 1.2.2

airtest版本通过pip freeze可以命令可以查到

设备:

其他相关环境信息 (其他运行环境,例如在linux ubuntu16.04上运行异常,在windows上正常。)

yimelia commented 4 years ago

是的,用子线程可能会有一些问题,主要报错代码是这里 要不就是去掉线程,只在你的脚本里循环进行判断。 或者,要不可以考虑线程里面的截图不用默认的minicap,而是指定采用ADBCAP的方式来截图。也就是说,需要另外初始化一个device对象,用它来截图,写起来会比较麻烦。

pastel001 commented 4 years ago

这个是主线程和子线程都需要截图,然后产生的问题是吧。 swipe也需要截图吗?swipe可以不截图吗?

yimelia commented 4 years ago
  1. 是的
  2. 不是swipe的问题,是主线程里已经初始化了一个Minicap对象,无论是否调用到截图,在另外子线程里去尝试截的话都可能出现问题
pastel001 commented 4 years ago

好的,关于aittest的学习,除了看代码,有什么其他的关于架构和模块的介绍文档吗? 直接看代码不一定看得懂。官网都是入门的指导。想学一学,谢谢啦

yimelia commented 4 years ago

深入的架构和模块介绍的话暂时没有比官网文档更加详细的,你也可以微信关注公众号:AirtestProject,我们会定期推送一些文章,之前也发过一些文章可以参考

pastel001 commented 4 years ago

好的,谢谢