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 ()
最初にテキストを使用して、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();
以下のコードは私のために働きます。
//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;
}
}
uiautomator
サポートされていません:親ノードを直接取得します
ただし、自分で追加することはできます(多くの作業が必要です)
一般的な手順:
xpath
[.____にuiautomator
を追加します。]xpath
を使用して親ノードを見つけるd.xpath("/current_node_path/..")
追加ノード:
私が使う
uiautomator2
_は xiaocong/uiautomator [.____に基づいています。]次の方法で親ノードを正常に検索するには:
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)
_
あなたの参照のために。
オン/オフスライダーだけを検索したい場合->ブルートゥースのオフ/オンボタンを直接検索し、それをクリックしてブルートゥースを無効/有効にすることができます-
コマンドプロンプトでBluetoothページのスクリーンショットを確認し(コマンド-uiautomatorviewerを使用)、OFFボタンのOFF/ONスライダーにテキストが表示されることを確認できます。次に、単に-を使用します
new UiObject(new UiSelector().text("OFF")).click();
最近、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です。