web-dev-qa-db-ja.com

uiautomatorを使用してビューの親を取得するにはどうすればよいですか?

UIを自由にナビゲートできるように、ui要素の親ビューを識別しようとしています。

たとえば、設定アプリでは、「Bluetooth」というテキストのビューを見つけることができます。

UiObject btView = new UiObject(new UiSelector().text("Bluetooth"));

さて、私が行き詰まっている部分はこれです:私は2つのレベルを上にナビゲートし、Bluetoothを有効または無効にするオン/オフボタンの新しい検索を開始したいと思います。

注:以下のコードを使用すると、ボタンを取得できます。

UiObject btButtonView = new UiObject(new UiSelector().className("Android.widget.Switch").instance(1));

これはスイッチボタンを検索し、2回目の遭遇を返します。検索をより正確にし、「Bluetooth」テキストを含む線形レイアウトのボタンを探します。

更新:これは設定アプリ(私が必要とするBluetooth部分)のレイアウトです:

LinearLayout
    LinearLayout
        ImageView
    RelativeLayout
        TextView (with text = "Bluetooth")
    Switch ()
15
Gabriel Porumb

最初にテキストを使用して、UiObjectを2レベル上に見つける必要があります。これは、UiCollectionまたはUiScrollableのgetChildByText()メソッドを使用して実行できます。次に、スイッチを簡単に見つけることができます。 「設定」の場合、このコードは私のデバイスで機能します。

UiScrollable settingsList = new UiScrollable(new UiSelector().scrollable(true));
UiObject btItem = settingsList.getChildByText(new UiSelector().className(LinearLayout.class.getName()),"Bluetooth", true);

UiObject btSwitch = btItem.getChild(new UiSelector().className(Android.widget.Switch.class.getName()));
btSwitch.click();
15
Anders

以下のコードは私のために働きます。

//Getting the scrollable view

UiScrollable settingsList = new UiScrollable(new UiSelector().scrollable(true));

for (int i=0; i<=settingsList.getChildCount(new UiSelector ().className(LinearLayout.class.getName())); i++) {
//Looping through each linear layout view
UiObject linearLayout = settingsList.getChild(new UiSelector().className(LinearLayout.class.getName()).instance(i));

//Checking if linear layout have the text. If yes, get the switch, click and break out of the loop.
if (linearLayout.getChild(new UiSelector ().text("Bluetooth")).exists()) {
    UiObject btSwitch = linearLayout.getChild(new UiSelector().className(Android.widget.Switch.class.getName()));
    btSwitch.click ();
    break;
    }
}
4
karthick1616

uiautomatorサポートされていません:親ノードを直接取得します

ただし、自分で追加することはできます(多くの作業が必要です)

一般的な手順:

  1. xpath [.____にuiautomatorを追加します。]
  2. xpathを使用して親ノードを見つけるd.xpath("/current_node_path/..")

追加ノード:

私が使う

次の方法で親ノードを正常に検索するには:

self.driver.xpath("//Android.widget.TextView[@text='Contact']/..")

および完全なコード:

_    def isMatchNode(self, curNodeAttrib, toMathInfo):
        isAllMatch = True
        for eachKey, eachToMatchValue in toMathInfo.items():
            if eachKey not in curNodeAttrib:
                isAllMatch = False
                break

            curValue = curNodeAttrib[eachKey]
            if curValue != eachToMatchValue:
                isAllMatch = False
                break


        return isAllMatch


    def findParentNode(self, curNodeXpath, matchDict, maxUpLevel=3):
        matchNode = None

        curNode = self.driver.xpath(curNodeXpath).get()
        curNodeAttrib = curNode.attrib # .attrib contain 'clickable'
        # curNodeInfo = curNode.info # .info not contain 'clickable'
        isCurMatch = self.isMatchNode(curNodeAttrib, matchDict)
        if isCurMatch:
            # current is match
            matchNode = curNode
        else:
            # try parent nodes
            curUpLevel = 1
            curParentNodeXpath = curNodeXpath
            hasFound = False
            while((not hasFound) and (curUpLevel <= maxUpLevel)):
                curParentNodeXpath += "/.."
                curParentNode = self.driver.xpath(curParentNodeXpath).get()
                curParentNodeAttrib = curParentNode.attrib
                isCurParentMatch = self.isMatchNode(curParentNodeAttrib, matchDict)
                if isCurParentMatch:
                    matchNode = curParentNode
                    break


        return matchNode


    def location_WexinAdd(self, reload=False):
        for eachNodeText in ["Contact", "Public Account"]:
            eachNodeXpath = "//Android.widget.TextView[@text='%s']" % eachNodeText
            matchDict = {"clickable": "true"}
            clickableParentNode = self.findParentNode(curNodeXpath=eachNodeXpath, matchDict=matchDict)
            if clickableParentNode:
                clickableParentNode.click()
            else:
                logging.warning("Fail click %s for not found clickable=true (parent) node", eachNodeText)
_

あなたの参照のために。

0
crifan

オン/オフスライダーだけを検索したい場合->ブルートゥースのオフ/オンボタンを直接検索し、それをクリックしてブルートゥースを無効/有効にすることができます-

コマンドプロンプトでBluetoothページのスクリーンショットを確認し(コマンド-uiautomatorviewerを使用)、OFFボタンのOFF/ONスライダーにテキストが表示されることを確認できます。次に、単に-を使用します

   new UiObject(new UiSelector().text("OFF")).click();
0
Smriti

最近、getFromParent(UiObjectの場合)とfromParent(UiSelectorの場合)を使用して、たとえばオブジェクトの叔父を選択できることがわかりました。そのようなレイアウトがある場合:

`LinearLayout
    relative layout
        text View
    relative layout
        check box`

このコードでtextviewからチェックボックスを取得できます:

TextViewTitle().getFromParent(new UiSelector()
            .fromParent(new UiSelector()
                    .resourceId("Android:id/checkbox")));

ここで、TextViewTitleはテキストビューを備えたUiobjectです。

0
13bit