Appium — поиск элементов без имени класса

Я новичок в тестировании Appium для мобильных приложений. Приложение написано на реактивном языке.

У меня возникают проблемы с поиском элементов на экране мобильного устройства. При использовании uiAutomatorViewer для просмотра сведений об элементе имя класса не отображается для каждого элемента, поэтому нет способа найти элементы. Кажется, что отображается только индекс элементов.

Это ошибка разработчика или есть способ найти элементы, которые мне нужно знать?

введите здесь описание изображения

Это xml страницы. Вы можете грубо просмотреть его, и вы можете сказать, что нет никакой дополнительной информации:

<?xml version="1.0" encoding="UTF-8"?>
<hierarchy rotation="0">
   <node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="me.passionfruit.app.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][1440,2792]">
      <node index="0" text="" resource-id="" class="" package="me.passionfruit.app.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][1440,2792]">
         <node index="0" text="" resource-id="" class="" package="me.passionfruit.app.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][1440,2792]">
            <node index="0" text="" resource-id="" class="" package="me.passionfruit.app.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,168][231,256]">
               <node index="0" text="" resource-id="" class="" package="me.passionfruit.app.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,168][231,256]" />
            </node>
            <node index="1" text="" resource-id="" class="" package="me.passionfruit.app.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[1209,168][1440,256]">
               <node index="0" text="" resource-id="" class="" package="me.passionfruit.app.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[1209,168][1440,256]" />
            </node>
            <node index="2" text="" resource-id="" class="" package="me.passionfruit.app.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[56,326][119,391]" />
            <node index="3" text="Find someone passionate about ..." resource-id="" class="" package="me.passionfruit.app.android" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="true" password="false" selected="false" bounds="[154,288][1332,428]" />
            <node index="4" text="" resource-id="" class="" package="me.passionfruit.app.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" bounds="[0,574][1440,1104]">
               <node index="3" text="" resource-id="" class="" package="me.passionfruit.app.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,617][347,1019]">
                  <node index="0" text="Leon" resource-id="" class="" package="me.passionfruit.app.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,642][171,759]" />
                  <node index="1" text="So" resource-id="" class="" package="me.passionfruit.app.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[8,759][110,863]" />
                  <node index="2" text="READING" resource-id="" class="" package="me.passionfruit.app.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,895][248,993]" />
               </node>
               <node index="4" text="" resource-id="" class="" package="me.passionfruit.app.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[400,592][1041,1039]">
                  <node index="0" text="Tim" resource-id="" class="" package="me.passionfruit.app.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[629,620][813,750]" />
                  <node index="1" text="Choy" resource-id="" class="" package="me.passionfruit.app.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[604,750][837,866]" />
                  <node index="2" text="POTATOES" resource-id="" class="" package="me.passionfruit.app.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[485,901][956,1010]" />
               </node>
               <node index="5" text="" resource-id="" class="" package="me.passionfruit.app.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[1094,617][1440,1019]">
                  <node index="0" text="Kevin" resource-id="" class="" package="me.passionfruit.app.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[1252,642][1440,759]" />
                  <node index="1" text="Feng" resource-id="" class="" package="me.passionfruit.app.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[1280,759][1440,863]" />
                  <node index="2" text="DOGS" resource-id="" class="" package="me.passionfruit.app.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[1263,895][1440,993]" />
               </node>
            </node>
            <node index="5" text="New Matches" resource-id="" class="" package="me.passionfruit.app.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[35,484][1440,575]" />
            <node index="6" text="Daily Feed" resource-id="" class="" package="me.passionfruit.app.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[35,1104][1440,1194]" />
            <node index="7" text="" resource-id="" class="" package="me.passionfruit.app.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" bounds="[0,1195][1440,2792]">
               <node index="0" text="" resource-id="" class="" package="me.passionfruit.app.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[258,1465][1185,2451]">
                  <node index="0" text="Paul" resource-id="" class="" package="me.passionfruit.app.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[565,1672][878,1861]" />
                  <node index="1" text="Deng" resource-id="" class="" package="me.passionfruit.app.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[557,1861][886,2029]" />
                  <node index="2" text="SOCCER" resource-id="" class="" package="me.passionfruit.app.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[440,2061][1003,2228]" />
               </node>
               <node index="1" text="" resource-id="" class="" package="me.passionfruit.app.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[235,1373][1202,2402]">
                  <node index="0" text="Joy" resource-id="" class="" package="me.passionfruit.app.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[582,1589][855,1787]" />
                  <node index="1" text="Xiao" resource-id="" class="" package="me.passionfruit.app.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[575,1787][864,1961]" />
                  <node index="2" text="BUNNIES" resource-id="" class="" package="me.passionfruit.app.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[391,1995][1047,2170]" />
               </node>
               <node index="2" text="" resource-id="" class="" package="me.passionfruit.app.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[216,1279][1224,2351]">
                  <node index="0" text="Henry" resource-id="" class="" package="me.passionfruit.app.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[476,1504][965,1710]" />
                  <node index="1" text="Last" resource-id="" class="" package="me.passionfruit.app.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[583,1710][857,1892]" />
                  <node index="2" text="FRISBEE" resource-id="" class="" package="me.passionfruit.app.android" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[416,1927][1024,2109]" />
               </node>
            </node>
         </node>
      </node>
   </node>
</hierarchy>

person J0nathan Lam    schedule 22.08.2019    source источник
comment
Вы можете сохранить xml экрана с помощью UIAutomatorViewer. Можете ли вы добавить соответствующую часть к вопросу? Можно ли использовать какой-либо другой элемент? Потому что в этом случае я не уверен, что есть стабильное решение. Вы можете использовать все остальные атрибуты, но кажется, что уникального значения нет.   -  person AndiCover    schedule 22.08.2019
comment
Я добавил xml страницы. Я не думаю, что подробности для xml помогут, потому что на странице нет информации, которая помогла бы мне создать xpath.   -  person J0nathan Lam    schedule 27.08.2019
comment
Вы можете попросить разработчика добавить к элементам уникальные идентификаторы. Я бы предложил установить идентификатор ресурса для всех соответствующих элементов.   -  person AndiCover    schedule 27.08.2019


Ответы (1)


Из того, что я вижу на вашем скриншоте, есть index атрибут, который вы можете использовать для идентификации ваш элемент, чтобы вы могли попробовать следующий селектор XPath

//*[@index='1']

однако трудно сказать, будет ли это уникальное совпадение или нет, в будущем рассмотрите возможность выполнения Исходный код и вставка иерархии пользовательского интерфейса вместо фотографии вашего экрана.

Другие подходы к просмотру структуры DOM приложения:

person Dmitri T    schedule 24.08.2019
comment
Я пробовал: //android.widget.FrameLayout[@index='0']/[@index='0']/[@index='0']/[@index='0'] но это не так не работает. Программа не находит элемент. - person J0nathan Lam; 27.08.2019
comment
Я попытался использовать Appium Studio, чтобы найти элемент. Я получил этот xpath: ((//*[./parent::*[./parent::*[./parent::*[./parent::*[./parent::*[./parent::*[./parent::*[./parent::*[./parent::*[./parent::*[./parent::*[@class='android.widget.FrameLayout' and ./parent::*[@class='android.widget.FrameLayout' and ./parent::*[@class='android.widget.FrameLayout' and ./parent::*[@id='content']]]]]]]]]]]]]]]/*)[1]/*/*/*[@text])[1], но он не работает. - person J0nathan Lam; 27.08.2019