Python Androidviewclient dump()挂起在转换屏幕上

Python Androidviewclient dump()挂起在转换屏幕上,python,emulation,dump,androidviewclient,Python,Emulation,Dump,Androidviewclient,我在Windows上使用最新的AndroidViewClient版本。脚本单击下一个按钮后,应用程序连接到远程服务器并等待响应,在此期间,屏幕上会出现类似“等待进度条”的内容。问题是等待时间是随机的。我使用while循环等待下一页屏幕的特定视图,类似于这篇文章中的“”。但是,如果time.sleep()太短,脚本将永远挂起在代码行vc.dump()上,正好挂在ViewServer的方法dump()的代码行“received+=s.recv(1024)”上。存在watchguard ViewCli

我在Windows上使用最新的AndroidViewClient版本。脚本单击下一个按钮后,应用程序连接到远程服务器并等待响应,在此期间,屏幕上会出现类似“等待进度条”的内容。问题是等待时间是随机的。我使用while循环等待下一页屏幕的特定视图,类似于这篇文章中的“”。但是,如果time.sleep()太短,脚本将永远挂起在代码行vc.dump()上,正好挂在ViewServer的方法dump()的代码行“received+=s.recv(1024)”上。存在watchguard ViewClient.setAlarm(120),但signal.alarm在Windows上不起作用。为什么不在received+=s.recv(1024)之前使用s.settimeout(120)并尝试/except block以防止Windows上出现阻塞状态?

我通过对函数调用使用超时并在while循环中重试直到成功,从而避免了此问题。有关如何使用信号,请参阅

以下用于等待基于文本的视图的功能有效:

import signal

def wait_for_text(vc, text):
    while 1:
        try:
            print('vc dump for text: ' + text)
            signal.alarm(5)
            vc.dump(window=-1, sleep=0)
            signal.alarm(0)
            print('finished: ' + text)
            if vc.findViewWithText(text) is None:
                time.sleep(0.5)
            else:
                return
        except:
            exc_type, exc_value, exc_tb = sys.exc_info()
            print(''.join(trace.format_exception(exc_type, exc_value, exc_tb)))
            time.sleep(0.5)
    raise RuntimeError('Failed waiting '+str(timeout)+'s for text: ' + text)

要了解更多信息,当脚本永远挂起并且远程服务器最终返回响应时,屏幕上会显示一个新页面,我可以在另一个终端上手动执行命令转储,并找到我要查找的特定视图,没有任何问题,但是正在运行的脚本一直挂着,停止它的唯一方法是杀死它。如果您在Windows上测试您的解决方案(很遗憾,我不能这样做)并正常工作,我很乐意合并一个补丁。是的,在dump()方法中,我为套接字上的任何操作添加了一个watchguard超时,以防止在所有平台上都可用的阻塞状态。以下是更改:s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)s.settimeout(15),而True:if DEBUG_RECEIVED:print>>sys.stderr,“从套接字读取…”尝试:RECEIVED+=s.recv(1024),异常除外,ex:print>>sys.stderr,“ERROR:”,ex if doneRE.search(接收到[-7:]):中断windows上的测试工作正常,接收数据的套接字不再阻塞。@不幸的是,设置套接字超时仍然有一些挂起。我用另一个解决方案进行测试,它看起来很健壮,很有前途。我使用模块eventlet,它定义了一个超时,并且是线程化的。我测试了一下,再也没有绞刑了。我将让脚本24/24运行,然后查看。下面是我在viewclient.py中添加的代码