Appium Or (|) Условие для UiSelector (). ResoureIdMatches дает NoSuchElementException - PullRequest
0 голосов
/ 13 октября 2019

Я создаю класс POM для класса / виджета Header в разделе Main Activity (пример приложения Reddit. См. Скриншоты ниже.) Проходя через Inspector, я вижу, что в заголовке будет доступно поле поиска, но если бы я былчтобы перейти к другому разделу / вкладке основного действия, поле поиска становится недоступным. Идентификатор / идентификатор ресурса также изменяется, заканчиваясь либо: id / search_view, либо: id / toolbar_title. Моя первоначальная реакция на этот вопрос - нет, но я хочу обратиться к любому, кто сталкивался с этой конкретной темой, прежде чем вызывать ее.

Я хотел посмотреть, смогу ли я сохранить любой идентификатор в одном MobileElement длямой класс заголовка, использующий условие Regex внутри UiSelector при вызове метода ResourceIdMatches.

Вот то, что у меня есть для моего в настоящее время в классе My Header. (Фокус на navTitle MobileElement):

@AndroidFindBy(id="com.reddit.frontpage:id/toolbar")
public MobileElement headerSection;

@AndroidFindBy(id = "com.reddit.frontpage:id/nav_icon")
public MobileElement userIcon;

//Needs work
@AndroidFindBy(uiAutomator = "new UiSelector()"
        + ".resourceIdMatches(\".*id/^([search_view|toolbar_title])+$\")")
public MobileElement navTitle;

public RedditMainActivityHeader(AppiumDriver<MobileElement> driver) {
    super(driver);
}

Во время исследования темы Regex я отредактировал условие Regex, прежде чем использовать границы слов (\ b), не используя [], используя * вместо +,Альтернативой для решения этой проблемы может быть создание второго класса Header, при котором navTitle найдет идентификатор с помощью: id / search_view или: id / toolbar_title, но я бы не хотел делать это на практике с точки зрения управления классами.

Снимок экрана: версия 1: Header Section версия 2: enter image description here

1 Ответ

0 голосов
/ 15 октября 2019

Найдена альтернатива для использования нескольких условий. Я провел дополнительные исследования по использованию стратегий локаторов с использованием нескольких условий и обнаружил, что вы можете использовать локаторы xpath с className и id / resource-id. Однако это будет зависеть от того, останется ли тег className вместе с изменениями идентификатора ресурса. На данный момент моя ситуация соответствует этим условиям.

@AndroidFindBy(xpath="//android.widget.TextView[@resource-id='com.reddit.frontpage:id/search_view' or @resource-id='com.reddit.frontpage:id/toolbar_title']")
public MobileElement navTitle;
...