`AndroidViewClient`没有更新消失的视图?

时间:2014-05-20 13:13:56

标签: android automation androidviewclient

在某些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_RECEIVEDDEBUG_TREEviewclient.py设置为TRUE

这些是我在viewclient.pyadbclient.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()功能完美无缺!

2 个答案:

答案 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