Appium Or( | ) UiSelector().ResoureIdMatches 的条件给出 NoSuchElementException

Appium Or( | ) Condition for UiSelector().ResoureIdMatches gives NoSuchElementException

我正在为 Main Activity 部分中的 Header class/widget 创建一个 POM class(例如 Reddit 应用程序。请参见下面的屏幕截图。)通过 Inspector,我see header 将有可用的搜索框,但如果我移动到 Main Activity 的另一个 section/tab,搜索框将变得不可用。 id/resource-id 也以 :id/search_view 或 :id/toolbar_title 结尾。 我对这个问题的最初反应是否定的,但想在退出之前联系遇到这个特定主题的任何人。

我想看看我是否能够在调用 ResourceIdMatches 方法时使用 UiSelector 中的 Regex 条件将任一 Id 存储到我的 Header class 的单个 MobileElement 中。

这是我当前在“我的页眉”中的内容 class。 (焦点在 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 主题时,我在使用 word bounderies(\b) 之前编辑了 Regex 条件,而不是使用 [],使用 * 而不是 +。解决这个问题的替代方法是创建第二个 Header class 并让 navTitle 通过 :id/search_view 或 :id/toolbar_title 找到 id,但我不想那样做从管理 classes.

的实践角度来看

截图: 版本 1: 版本 2:

找到使用多个条件的替代方法。我对使用多个条件使用定位器策略进行了更多研究,发现您可以将 xpath 定位器与 className 和 id/resource-id 一起使用。但是,这取决于 className 标记是否随着 resource-id 的更改而保持不变。目前,我的情况符合这些条件。

@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;