web-dev-qa-db-ja.com

appiumを使用してAndroid elementのxpathを特定する必要があります

Appiumフレームワークを使用してAndroidアプリケーションをテストしています。ビューのIDがないAndroid画面があります(そして、したくない)追加...)、Xpathを使用することを考えました。

これは、UI Automator Viewerでの画面の外観です。 enter image description here

すべての相対的なレイアウトを取得したい(赤でマークされている-16項目)

私は以下を試しました:

 List<WebElement> webElementslist =
 mAppDriver.findElementsByXPath("//Android.widget.LinearLayout[1]/Android.widget.FrameLayout[1]/Android.widget.RelativeLayout[1]/Android.widget.ViewAnimator[1]/Android.widget.FrameLayout[1]/Android.widget.RelativeLayout[1]/Android.widget.RelativeLayout[1]/Android.widget.RelativeLayout[1]/Android.widget.ScrollView[1]/Android.widget.LinearLayout[1]/Android.widget.LinearLayout[1]/Android.widget.LinearLayout[2]");

しかし、私は何のアイテムも手に入れませんでした。

Webを検索して、次のxpathチュートリアルを見つけ、さらに多くのオプションを試しましたが、やはり成功しませんでした。

http://www.zvon.org/comp/r/tut-XPath_1.html#intro

http://www.w3.org/TR/xpath/

助けていただければ幸いです。

10
Ofir A.

現在、XPathにはAndroidで、表示されている動作を説明する厄介なバグがいくつかあります。これらは 1.3.1リリース で修正される予定です。

  1. ルートノードで検索することはできません。 リンク
    • 残念ながら、これは冗長なxpathがxpathである可能性が高いことを意味します(しゃれ) 成功へ
  2. 16個しかない場合に240個の要素を取得することがあります link

理想的には、16個すべてのRelativeLayoutsの_Android.widget.LinearLayout_親のリソースIDを探して、次のようにすることができます。

_//Android.widget.LinearLayout[@resource-id="foo"]/Android.widget.RelativeLayout
_

レイアウトの1つに_[2]_の位置を指定したため、詳細なソリューションは機能しませんでした。

これが修正されました:

_//Android.widget.LinearLayout[1]/Android.widget.FrameLayout[1]/Android.widget.RelativeLayout[1]/Android.widget.ViewAnimator[1]/Android.widget.FrameLayout[1]/Android.widget.RelativeLayout[1]/Android.widget.RelativeLayout[1]/Android.widget.RelativeLayout[1]/Android.widget.ScrollView[1]/Android.widget.LinearLayout[1]/Android.widget.LinearLayout[1]/Android.widget.LinearLayout/Android.widget.RelativeLayout
_

....最初の解決策を使用してください。

UiAutomatorロケーター戦略を使用して問題の解決策を検討していますが、まだ回答がありません(.fromChild().fromParent()が壊れているように見えるため)

7
Jess

これを試してみてくださいuは簡単にアクセスできます

driver.findElement(By.xpath("//*[@class='Android.widget.FrameLayout' and @bounds='[418,564][780,885]']")).click();

Screenshot of UI

1
Rajesh G

//foo[1]が(fooノードの最初の子ではなく)親の最初の子であるすべてのfooノードを返すという事実を念頭に置いて、次のようなことを試してください。

//ScrollView/LinearLayout/LinearLayout[2]/LinearLayout/RelativeLayout

テストされていませんが、ScrollViewの子であるLinearLayoutの2番目の子であるLinearLayoutの子であるLinearLayoutの子であるすべてのRelativeLayoutを提供する必要があります。

1
TinyTimZamboni

完璧に機能する

By.xpath( "// [@ id = 'id1']/follow-sibling :: [@ id = 'id2']"));

0
Manish

次のコードは私のために働いた:

WebElement webElement = driver.findElementByXPath("//Android.widget.ListView[1]/Android.widget.LinearLayout[1]");

礼儀: Appiumでxpathを使用して要素を見つけることができません

0
Mat