2013-03-26 10 views
6

私の会社のモバイルアプリケーションをテストするためにAppiumを使い始めようとしています。私はスクリプトを書くためにPythonのバインディングを使いたいと思っています。私はAndroidのアプリケーションから始める必要があります。Appium向けSelenium Pythonバインディングのすべての要素を列挙します

私はすべての働くAppiumの例があります。私はgrunt androidを実行してテストを行い、android.pyサンプルアプリケーションを実行できます。

しかし、私は初心者です。私の会社のアプリでコントロールを特定する方法を明確に把握していません。私はPythonに慣れているので、コントロール要素のリストを作成してイントロスペクトすると思っていました。

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

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

私は、アプリケーションのソースコードを入手したり、Eclipseでアプリケーションをビルドするなどの作業をしなくても要素を把握できると考えていましたが、必要な場合はこれを行うことができます。

P.S.私はPythonを使用する方が好きですが、それがうまくいくならば、イントロスペクションを行うために他の何かを使うことにオープンになります。私はまだPythonで実際のテストを書くことができました。

答えて

2

私はまだPythonからSeleniumインターフェイスをイントロスペクトする方法をお勧めします。しかし、私はアプリケーションがどのように配置されているかの明確なイメージを得るための実行可能な方法を見つけました。そして、Seleniumテストの書き方を理解するのはかなり簡単です。

まず、Android開発コンピュータに接続された実際のデバイスまたはエミュレータのいずれかでアプリを稼働させます。基本的にadb devicesを実行すると、あなたのアプリケーションを実行している1つのデバイスを見たいと思っています。次に、uiautomatorviewerツールを実行し、Device Screenshotツールバーのアイコンをクリックします。 (ツールバーアイコンは2つしかありません。最初はOpenのアイコンで、ファイルフォルダのように見えます。携帯電話のように見えます)

これを済ませたら、あなたのアプリのイメージ左にスクリーンショット、右にブラウズ可能なツリーの概要が表示されます。アウトラインには、アプリのすべてのコントロールがテキストラベルとともに表示され、その他の情報(clickableのプロパティがそのコントロールの場合はtrueまたはfalseかどうかなど)が表示されます。

1つの警告:コントロールには番号が付けられていますが、Seleniumバインディングでは数字が同じではない可能性があります。 ApiDemosサンプルアプリケーションでは、Graphicsボタンは5番目のボタンであるのでインデックス番号4を持ちますが、その位置でアクセスするためにはインデックス5を使用しなければなりませんでした。インデックス0はクリックできないオブジェクトで、 "API Demos"別のFrameLayoutオブジェクトで、画面のヘッダーを構成します。 driver.find_element_by_name()コールアウト

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

コメント、および全体ではなく、アプリで第六TextViewを見つける:

だから、私はandroid.pyスクリプトにこの変更を行うことができました。これはベストプラクティスではありませんが、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のものがあれば教えてください。

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 
+0

ありがとうございます。私はすでにこれを試して、それは私のために動作しません...テストセッションはエラーで終了します。あなたはiOSアプリケーションまたはAndroidアプリケーションでテストしましたか?私はそれがIOSのために適切に動作すると確信していますが、Androidの場合はまだ動作していないと思います。 – steveha