Почему XCUITest работает слишком медленно для приложения iOS? - PullRequest
0 голосов
/ 18 октября 2019

Я хочу получить значение динамического элемента в родном приложении iOS. Я использовал XCUITest, чтобы получить путь к элементу. Path работает нормально, но получение / печать значения занимает около 1 минуты. Я не использовал ожидание.

Мой код:

String El1="//XCUIElementTypeApplication[@name='appName']/XCUIElementTypeWindow[1]/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeTable/XCUIElementTypeCell[5]/XCUIElementTypeStaticText";

 System.out.println("Value: "+driver.findElementByXPath(El1).getText());

Ответы [ 2 ]

1 голос
/ 19 октября 2019

Причина в том, что ваша строка xpath очень длинная. Это имеет тенденцию замедлять Appium, поскольку в вашем случае он должен пройти длинный путь. Это очень хрупкая и плохая идея, чтобы поставить абсолютный xpath тоже.
Есть несколько способов получить элемент

имя класса
идентификатор
имя
xpath
идентификатор доступа
строка предиката ios
цепочка классов ios



Обратитесь к вашему инспектору (пример Appium Inspector) на элементе.
Если есть доступный идентификатор, код должен быть

WebElement el = driver.findElement(MobileBy.AccessibilityID("foo"));




Имя класса
Имя класса должно быть вторым в строке. Это эффективно, особенно если есть только 1 уникальное имя класса - например, в форме есть только 1 кнопка

List<MobileElement> elementsTwo = (List<MobileElement>) driver.findElementsByClassName("XCUIElementTypeButton");





Стратегии локатора для iOS *
Вы можете попробовать iOSClassChain. Это следующий эффективный селектор. Пример

String selector = "**/XCUIElementTypeCell[`name BEGINSWITH "C"`]/XCUIElementTypeButton[10]";<br>
driver.findElement(MobileBy.iOSClassChain(selector));


Или вы можете попробовать использовать селектор предикатов.

driver.findElementsByIosNsPredicate("isWDVisible == 1");




Наконец, если все эти опции заканчиваются, вы должны использовать xpath в качестве последнего средства. Избегайте абсолютного xpath и используйте относительный xpath.



Абсолютный xpath

String El1="//XCUIElementTypeApplication[@name='appName']/XCUIElementTypeWindow[1]/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeTable/XCUIElementTypeCell[5]/XCUIElementTypeStaticText";


Относительный xpath

String El1 = “//XCUIElementTypeTable[name=‘Customer’]/XCUIElementTypeCell[5]/XCUIElementTypeStaticText”



1 голос
/ 18 октября 2019

XCTest - довольно быстрый фреймворк. Хотя Xpath очень распространен и гибок, это не лучший вариант для поиска элементов iOS. Вы должны сократить запрос для этого элемента и использовать findElementByIosNsPredicate

IOSElement settingsCell = driver.findElementByIosNsPredicate("type == 'XCUIElementTypeCell' AND name == 'Settings'");

Возможно, эта статья будет вам полезна

http://appium.io/docs/en/writing-running-appium/ios/ios-predicate/

...