0

一部の 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変数が取得されなかったと仮定すると、アプリケーションがロードされたときに受け取った値を保持したままになります。 Nonerefresh()LoadingAppNone

だから私のWhileループは無限になる

これはAndroidViewClientバグだと思います。

これを使用すると、アプリケーションがオンのときに LoadingApp = vc.findViewWithAttributeOrRaise("text", u'Loading\nMiLAB')最初に実行されたときに例外が発生します。refresh()

したがってAndroidViewClient、このビューを見つけることができません (これは正しいです!) が、コンテナ (変数) にはまだ古い、間違った、更新されていない値が含まれています。

更新日:

私の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_TREEに設定viewclient.pyTRUEます。

これらは、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 7OS 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()実際に変数を作成しました。私の機能としてそれらを宣言した後、完璧に動作します!localglobalglobalrefresh()

4

2 に答える 2

0

whileループはもっと似ているはずだと思います(ところで、変数は通常小文字で始まり、クラスと混同しないでください)

while True:
    print "MiLAB is still not ready.\nWaiting 5 seconds"
    time.sleep(5)
    refresh()
    try:
        vc.findViewWithTextOrRaise(u'Loading\nMiLAB')
    except ViewNotFoundException:
        break
于 2014-05-22T21:08:33.263 に答える