在某些Android应用程序上使用AndroidViewClient
运行我的脚本时,我区分了一个指示应用程序仍在加载的视图
我开始While
循环,内部延迟&像这样刷新:
while LoadingApp is not None:
print "Application is still not ready.\nWaiting 5 seconds"
print The Application is still loading...
time.sleep(5)
refresh()
refresh()
函数执行整个视图转储:
def refresh():
vc.dump(window='-1')
launcherIcon = vc.findViewById("fourier.milab:id/launcherIcon")
graphIcon = vc.findViewById("fourier.milab:id/graphIcon")
tableIcon = vc.findViewById("fourier.milab:id/tableIcon")
...
LoadingApp = vc.findViewWithAttribute("text", u'Loading\nMiLAB')
最后,应用程序完全打开,LoadingApp
视图不再显示。
我认为LoadingApp
变量在应用程序处于开启状态后执行第一个None
后变为refresh()
但LoadingApp
变量从未得到None
,它保持应用程序加载时收到的值。
所以我的While
循环变为无限
我认为这是AndroidViewClient
错误。
如果使用LoadingApp = vc.findViewWithAttributeOrRaise("text", u'Loading\nMiLAB')
,则在应用程序处于打开状态时,会在第一个refresh()
上引发异常。
所以AndroidViewClient
现在找不到这个视图(这是正确的!)但是它的容器(变量)仍然包含旧的,错误的,没有更新的值。
UPD :
我的While
循环代码是
f = open('my_text.txt','w+')
while LoadingMiLAB is not None:
print "MiLAB is still not ready.\nWaiting 5 seconds"
print LoadingMiLAB
for key, value in LoadingMiLAB.map.iteritems():
print key, value
f.write(key)
f.write('\t')
f.write(' '.join(map(str, value)))
f.write('\n')
f.write('\n\n\n')
print "\n\n\n"
time.sleep(5)
refresh()
我收到的输出是:
index 2
selected f a l s e
checked f a l s e
clickable f a l s e
package f o u r i e r . m i l a b
text L o a d i n g
M i L A B
long-clickable f a l s e
enabled t r u e
bounds (550, 418) (729, 491)
content-desc
focusable f a l s e
focused f a l s e
uniqueId i d / n o _ i d / 7
checkable f a l s e
resource-id f o u r i e r . m i l a b : i d / r a t e T e x t V i e w
password f a l s e
class a n d r o i d . w i d g e t . T e x t V i e w
scrollable f a l s e
这是我在加载应用程序,已加载应用程序时收到的内容,即使我已经关闭了应用程序。
所以我认为问题是:LoadingMiLAB
视图数据不会被视图不再出现时收到的None
对象覆盖。
我将DEBUG
中的DEBUG_RECEIVED
,DEBUG_TREE
和viewclient.py
设置为TRUE
。
这些是我在viewclient.py
或adbclient.py
文件中所做的唯一更改。
我不使用View.setVisibility(View.GONE)
或更改任何其他标志/参数。
我使用您的culebra
脚本及其默认设置。我在那里更改的唯一参数是创建的(输出)脚本文件名和目标。
当我添加print vc.findViewWithText(u'Loading\nMiLAB').getVisibility()
代码时,我在加载应用程序并显示视图时看到了-1
。
当加载应用程序(并且视图消失)时,我收到了
AttributeError: 'NoneType' object has no attribute 'getVisibility'
我使用的是vc.findViewWithText(u'Loading\nMiLAB').getVisibility()
,而不是vc.findViewWithTextOrRaise(u'Loading\nMiLAB').getVisibility()
因为这会在加载应用程序时出现错误,并且不再显示视图。
我正在使用Windows 7
OS PC
UPD2 :
我在While
循环中添加了一个异常。
while LoadingMiLAB:
print "MiLAB is still not ready.\nWaiting 5 seconds"
time.sleep(5)
refresh()
try:
LoadingMiLAB = vc.findViewWithText(u'Loading\nMiLAB')
except EmptyLoadingMiLABException:
print "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"
现在,我的脚本退出While
循环,并在LoadingMiLAB
视图不再显示时继续进行。
最终更新
这是我的错。我的refresh()
函数实际上创建了local
个变量,而没有刷新global
个视图状态。在将它们声明为global
后,我的refresh()
功能完美无缺!
答案 0 :(得分:1)
这是我的错。我的refresh()
函数实际上创建了局部变量,而没有刷新全局视图状态。在将它们声明为global
后,我的refresh()
功能完美无缺!
答案 1 :(得分:0)
我认为你循环应该更像(BTW,变量通常以小写开头,不要与类混淆)
while True:
print "MiLAB is still not ready.\nWaiting 5 seconds"
time.sleep(5)
refresh()
try:
vc.findViewWithTextOrRaise(u'Loading\nMiLAB')
except ViewNotFoundException:
break