一部の 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
、このビューを見つけることができません (これは正しいです!) が、コンテナ (変数) にはまだ古い、間違った、更新されていない値が含まれています。
更新日:
私の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()