7

会社のモバイル アプリケーションをテストするために Appium を使い始めようとしています。Python バインディングを使用してスクリプトを記述したいと考えており、Android アプリから始める必要があります。

Appiumの例はすべて機能しています。実行grunt androidしてテストが機能し、android.pyサンプル アプリを実行できます。

しかし、私はまったくの初心者であり、会社のアプリでコントロールを特定する方法を明確に把握していません。私はPythonの経験があるので、コントロール要素のリストを作成してそれらを内省するだけだと思いました。

私は立ち往生しています!のようなすべてのメソッドにdriver.find_elements_by_tag_name()は、特定の識別子が必要です (または、少なくとも、機能するワイルドカードが見つかりませんでした)。

テスト対象の Android アプリを表す要素の Appium ツリーをイントロスペクトするにはどうすればよいですか? すべての要素を列挙して内省できるようにするにはどうすればよいですか? アプリ内のすべての要素を見つけるために歩くことができるツリーはありますか?

アプリのソース コードを取得したり、Eclipse でアプリをビルドしたりする必要なく要素を把握できることを望んでいましたが、必要に応じてこれを行うことができます。

PS私はPythonを使用することを好みますが、それがうまく機能する場合は、他の何かを使用してイントロスペクションを行うことにオープンです。他の言語が何らかの形で大幅に優れていない限り、実際のテストは Python で書くことができました。

4

2 に答える 2

3

Python から Selenium インターフェイスをイントロスペクトする方法が必要です。しかし、アプリがどのようにレイアウトされているかを明確に把握するための実行可能な方法を見つけたので、Selenium テストの記述方法を理解するのは非常に簡単です。

まず、Android 開発用コンピューターに接続された実際のデバイスまたはエミュレーターでアプリを実行します。基本的に、実行する場合はadb devices、アプリを実行している単一のデバイスを表示する必要があります。次に、ツールを実行し、ツールバー アイコンuiautomatorviewerをクリックします。Device Screenshot(ツールバー アイコンは 2 つしかありません。1 つ目はOpenアイコンで、ファイル フォルダーのように見えます。もう 1 つは、携帯電話のスタックのように見えます。)

それが完了すると、アプリの画像が表示され、左側にスクリーンショット、右側にブラウズ可能なツリー アウトラインが表示されます。アウトラインには、アプリのすべてのコントロールが、テキスト ラベル (存在する場合)、およびその他の情報 (そのコントロールのclickableプロパティがtrueまたはfalseであるかどうかなど) と共に表示されます。

1 つの警告: コントロールには番号が付けられていますが、Selenium バインディングでは番号が異なる場合があります。ApiDemosサンプル アプリでは、ボタンは 5 番目のボタンであるため、Graphicsインデックス番号 4 を持っていますが、その位置でアクセスするにはインデックス 5 を使用する必要がありました。インデックス 0 は、テキスト「API Demos」を保持するクリックできないオブジェクトでした。FrameLayout画面のヘッダーを構成する別のオブジェクト。

android.pyそのため、スクリプトに次の変更を加えることができました。

#elem = driver.find_element_by_name('Graphics')
elem = driver.find_elements_by_tag_name('TextView')[5]

driver.find_element_by_name()呼び出しをコメントアウトし、代わりにTextViewアプリ全体で 6 番目を見つけます。これはベスト プラクティスではありuiautomationviewerませんが、コントロールについて知っておく必要があることを結果から確認できることを示しています。

これで、少し内省するのに十分なことがわかりました。

for elem in driver.find_elements_by_tag_name('TextView'):
    if elem.text == "Graphics":
        break
else:
    print("Could not find desired item")

これは単に電話をかけるよりも良いことではありませんdriver.find_element_by_name()が、私が正しい方向に進んでいることを示しています。

uiautomatorviewer私の問題に対する実用的な解決策です。純粋な Python をお持ちの場合は、それについてお知らせください。

于 2013-03-27T02:25:29.150 に答える
3

Appium は、WebDriver の「ページ ソース」メソッドをサポートします。だからあなたはこれを行うことができます:

# assume you have a driver object
import json

source = driver.page_source
source = json.loads(source)
# you can now work with source as a python object
于 2013-03-29T00:02:06.040 に答える