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

脚本循环使用exists进行查找,概率脚本卡主的情况 #655

Open pastel001 opened 4 years ago

pastel001 commented 4 years ago

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

(重要!问题分类)

描述问题bug 脚本循环使用exists进行查找,概率脚本卡主的情况

[07:43:14][DEBUG]<airtest.aircv.template_matching> find_best_result() run time is 0.11 s.
[07:43:14][DEBUG]<airtest.core.api> try match with BRISKMatching
[07:43:15][DEBUG]<airtest.aircv.keypoint_base> [BRISK] threshold=0.95, result={'result': [319, 223], 'rectangle': [(50, 152), (50, 293), (587, 293), (587, 152)]
, 'confidence': 0.7063780277967453}
[07:43:15][DEBUG]<airtest.aircv.keypoint_base> find_best_result() run time is 0.39 s.
[07:43:15][DEBUG]<airtest.core.api> match result: None
[07:43:15][INFO]<airtest.core.api> Try finding:
Template(C:\Users\Administrator\Desktop\worst1.0.0.air\tpl1575167306873.png)
[07:57:15][DEBUG]<airtest.core.android.rotation> orientationWatcher has ended
Traceback (most recent call last):
  File "F:\AirtestIDE_2019-09-11_py3_win64\sample\custom_launcher.py", line 46, in <module>
    run_script(args, CustomCase)
  File "D:\ProgramData\Anaconda3\lib\site-packages\airtest\cli\runner.py", line 138, in run_script
    result = unittest.TextTestRunner(verbosity=0).run(suite)
  File "D:\ProgramData\Anaconda3\lib\unittest\runner.py", line 176, in run
    test(result)
  File "D:\ProgramData\Anaconda3\lib\unittest\suite.py", line 84, in __call__
    return self.run(*args, **kwds)
  File "D:\ProgramData\Anaconda3\lib\unittest\suite.py", line 122, in run
    test(result)
  File "D:\ProgramData\Anaconda3\lib\unittest\case.py", line 653, in __call__
    return self.run(*args, **kwds)
  File "D:\ProgramData\Anaconda3\lib\unittest\case.py", line 605, in run
    testMethod()
  File "D:\ProgramData\Anaconda3\lib\site-packages\airtest\cli\runner.py", line 61, in runTest
    exec(compile(code.encode("utf-8"), pyfilepath, 'exec'), self.scope)
  File "C:\Users\Administrator\Desktop\worst1.0.0.air\worst1.0.0.py", line 135, in <module>
    t2_check_and_get()
  File "C:\Users\Administrator\Desktop\worst1.0.0.air\worst1.0.0.py", line 127, in t2_check_and_get
    catch_exception()
  File "C:\Users\Administrator\Desktop\worst1.0.0.air\worst1.0.0.py", line 33, in catch_exception
    exist = exists(Template(r"tpl1575167306873.png", threshold=0.9, target_pos=6, record_pos=(0.182, -0.829), resolution=(900, 1600)))
  File "D:\ProgramData\Anaconda3\lib\site-packages\airtest\utils\logwraper.py", line 78, in wrapper
    res = f(*args, **kwargs)
  File "D:\ProgramData\Anaconda3\lib\site-packages\airtest\core\api.py", line 411, in exists
    pos = loop_find(v, timeout=ST.FIND_TIMEOUT_TMP)
  File "D:\ProgramData\Anaconda3\lib\site-packages\airtest\utils\logwraper.py", line 78, in wrapper
    res = f(*args, **kwargs)
  File "D:\ProgramData\Anaconda3\lib\site-packages\airtest\core\cv.py", line 59, in loop_find
    screen = G.DEVICE.snapshot(filename=None)
  File "D:\ProgramData\Anaconda3\lib\site-packages\airtest\core\android\android.py", line 218, in snapshot
    screen = self.minicap.get_frame_from_stream()
  File "D:\ProgramData\Anaconda3\lib\site-packages\airtest\core\android\minicap.py", line 24, in wrapper
    return func(inst, *args, **kwargs)
  File "D:\ProgramData\Anaconda3\lib\site-packages\airtest\core\android\minicap.py", line 343, in get_frame_from_stream
    return six.next(self.frame_gen)
  File "D:\ProgramData\Anaconda3\lib\site-packages\airtest\core\android\minicap.py", line 282, in _get_stream
    frame_data = s.recv(frame_size)
  File "D:\ProgramData\Anaconda3\lib\site-packages\airtest\utils\safesocket.py", line 30, in recv
    trunk = self.sock.recv(min(size-len(self.buf), 4096))
KeyboardInterrupt
[07:57:15][DEBUG]<airtest.core.android.adb> D:\ProgramData\Anaconda3\lib\site-packages\airtest\core\android\static\adb\windows\adb.exe -s 192.168.31.63:5555 for
ward --remove tcp:19717
[07:57:16][DEBUG]<airtest.core.android.adb> D:\ProgramData\Anaconda3\lib\site-packages\airtest\core\android\static\adb\windows\adb.exe -s 192.168.31.63:5555 for
ward --remove tcp:15716

相关截图 image

复现步骤 我把图片查找时间设置的很短,不知道是不是这个原因 因为是循环查找,所以我把图片超时时间设置成1秒,然后只找一次,把TMP的时间设置成0.1秒了 ST.FIND_TIMEOUT = 1 ST.FIND_TIMEOUT_TMP = 0.1

预期效果 不知道出现了什么问题,该如何规避这种问题

python 版本: python3.5

airtest 版本: 1.1.1

设备:

其他相关环境信息

yimelia commented 4 years ago

能否顺便提供一下最简的可重现脚本,能用这个脚本进行大概率重现的,还有就是运行环境的主机信息也可以提供下,我们看看能否复现出来

pastel001 commented 4 years ago

估计概率比较低,跑了挺长时间才出问题的。早上家里电脑出现的问题,回家我再弄一下,复现出来把信息给你。

yimelia commented 4 years ago

好的,这个问题不好定位,可能是运行时间长了资源耗尽导致的,也可能是中途可能USB不稳定导致偶然断开,暂时还不清楚问题是什么

yajuntang commented 4 years ago

我也出现了这个问题,我目前的解决方案是跑Android的时候 启动一条线程 然后 每隔120秒启动一次pocoservice就可以解决了

pastel001 commented 4 years ago

我也出现了这个问题,我目前的解决方案是跑Android的时候 启动一条线程 然后 每隔120秒启动一次pocoservice就可以解决了 pocoservice怎么重启呢?能贴一下代码吗

pastel001 commented 4 years ago

另一个手机经常出现此问题,识别图片,touch之后不再执行 脚本、手机型号、AirTest版本、出问题时的输出如下。 出问题时识别到图片后点击一次,输出aaaa,然后没有再次点击,没有输出bbbb 脚本 `# -- encoding=utf8 -- author = "Administrator"

from airtest.core.api import * import threading import uiautomator2 as u2

ST.FIND_TIMEOUT = 1 ST.FIND_TIMEOUT_TMP = 0.1 ST.OPDELAY = 0.00

auto_setup(file)

connect_device("Android:///4L7PS8IZZSCQRCAA")

d = u2.connect('4L7PS8IZZSCQRCAA')

connect_device("Android:///192.168.31.129:5555") d = u2.connect('192.168.31.129:5555')

stop = False check = False count = 0

def t1_swipe(): global check global count while True: if not stop: try: count += 1 check = False d.swipe(456, 1189, 456, 1500,0.01) print("##########swipe:"+str(count)) sleep(0.30) check = True sleep(0.19) except Exception: pass

def t2_check_and_get(): global count global stop exist = find_all(Template(r"tpl1580686606759.png", threshold=0.95, record_pos=(0.0, 0.528), resolution=(1080, 1920))) touch((200,200))

开始轮询

while True:
    if check:
        print("check:"+str(count))
        exist  = find_all(Template(r"tpl1580652177970.png", threshold=0.95, target_pos=2, record_pos=(0.393, 0.003), resolution=(1080, 1920)))
        if exist:
            stop = True
            p= exist[0].get("result")
            if(y[0]<10000):
                touch(p,1)
                touch([537, 1535],100)
                print("aaaa")
                touch([537, 1535],50)
                print("bbbb")
            stop = False

t1 = threading.Thread(target=t1_swipe, daemon=True) t1.start()

t2_check_and_get() ` 输出:

##########swipe:116 [08:39:38][DEBUG] find_all_results() run time is 0.09 s. check:116 ##########swipe:117 [08:39:38][DEBUG] find_all_results() run time is 0.09 s. check:117 ##########swipe:118 [08:39:39][DEBUG] find_all_results() run time is 0.08 s. aaaa [08:49:12][DEBUG] orientationWatcher has ended Traceback (most recent call last): File "F:\AirtestIDE_2019-09-11_py3_win64\sample\custom_launcher.py", line 46, in run_script(args, CustomCase) File "D:\ProgramData\Anaconda3\lib\site-packages\airtest\cli\runner.py", line 138, in run_script result = unittest.TextTestRunner(verbosity=0).run(suite) File "D:\ProgramData\Anaconda3\lib\unittest\runner.py", line 176, in run test(result) File "D:\ProgramData\Anaconda3\lib\unittest\suite.py", line 84, in call return self.run(*args, kwds) File "D:\ProgramData\Anaconda3\lib\unittest\suite.py", line 122, in run test(result) File "D:\ProgramData\Anaconda3\lib\unittest\case.py", line 653, in call return self.run(*args, *kwds) File "D:\ProgramData\Anaconda3\lib\unittest\case.py", line 605, in run testMethod() File "D:\ProgramData\Anaconda3\lib\site-packages\airtest\cli\runner.py", line 61, in runTest exec(compile(code.encode("utf-8"), pyfilepath, 'exec'), self.scope) File "C:\Users\Administrator\Desktop\worst1.1.0_letv.air\worst1.1.0_letv.py", line 173, in t2_check_and_get() File "C:\Users\Administrator\Desktop\worst1.1.0_letv.air\worst1.1.0_letv.py", line 150, in t2_check_and_get touch([537, 1535],50) File "D:\ProgramData\Anaconda3\lib\site-packages\airtest\utils\logwraper.py", line 78, in wrapper res = f(args, kwargs) File "D:\ProgramData\Anaconda3\lib\site-packages\airtest\core\api.py", line 259, in touch try_log_screen() File "D:\ProgramData\Anaconda3\lib\site-packages\airtest\utils\logwraper.py", line 78, in wrapper res = f(*args, *kwargs) File "D:\ProgramData\Anaconda3\lib\site-packages\airtest\core\cv.py", line 97, in try_log_screen screen = G.DEVICE.snapshot() File "D:\ProgramData\Anaconda3\lib\site-packages\airtest\core\android\android.py", line 218, in snapshot screen = self.minicap.get_frame_from_stream() File "D:\ProgramData\Anaconda3\lib\site-packages\airtest\core\android\minicap.py", line 24, in wrapper return func(inst, args, **kwargs) File "D:\ProgramData\Anaconda3\lib\site-packages\airtest\core\android\minicap.py", line 343, in get_frame_from_stream return six.next(self.frame_gen) File "D:\ProgramData\Anaconda3\lib\site-packages\airtest\core\android\minicap.py", line 282, in _get_stream frame_data = s.recv(frame_size) File "D:\ProgramData\Anaconda3\lib\site-packages\airtest\utils\safesocket.py", line 30, in recv trunk = self.sock.recv(min(size-len(self.buf), 4096)) KeyboardInterrupt [08:49:13][DEBUG] D:\ProgramData\Anaconda3\lib\site-packages\airtest\core\android\static\adb\windows\adb.exe -s 192.168.31.129:5555 fo rward --remove tcp:17750 [08:49:13][DEBUG] D:\ProgramData\Anaconda3\lib\site-packages\airtest\core\android\static\adb\windows\adb.exe -s 192.168.31.129:5555 fo rward --remove tcp:17050 终止批处理操作吗(Y/N)?

python 版本: python3.6.3

airtest 版本: 1.1.1

设备:

型号: 乐视手机 乐1 x600 系统: Android 6.0

lincoln987 commented 4 years ago

本人在 airtest 1.1.1遇到过同样的问题 升级到 airtest 1.1.3后该故障消失

pastel001 commented 4 years ago

本人在 airtest 1.1.1遇到过同样的问题 升级到 airtest 1.1.3后该故障消失

谢谢