我在Windows上使用的是最新的AndroidViewClient版本。脚本点击接下来的按钮后,应用程序连接到远程服务器并等待响应,这期间屏幕上有一个类似 "等待进度条 "的东西。问题是等待时间是随机的。我使用了一个while循环等待下一页屏幕的特定视图,类似于这个帖子"在androidviewclient上等待一个特定的视图。". 但如果time.sleep()太短,脚本就会永远挂在vc.dump()的代码行上,准确的说是挂在ViewServer的这个方法dump()的代码行 "received += s.recv(1024) "上。有一个看守ViewClient.setAlarm(120),但是signal.ararm在Windows上不能用。为什么不在received += s.recv(1024)之前使用s.settimeout(120)和tryexcept 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)