【问题标题】:How to tap on a element which is focused in appium. Unable to select value of a dropdown in appium如何点击一个专注于 appium 的元素。无法在 appium 中选择下拉列表的值
【发布时间】:2018-02-12 16:29:25
【问题描述】:

我遇到了一个问题,下拉值的元素没有显示在 uiautomatorviewer 中。

虽然我通过屏幕的getPageSource 检查了 XML DOM,但移动应用屏幕上显示的结果也没有任何价值

XML sn-p 如下:-

<android.widget.FrameLayout index="0" text="" class="android.widget.FrameLayout" package="com.demo.pass" 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,145][540,196]" resource-id="com.demo.pass:id/frameSearchLocation" instance="6">
    <android.widget.EditText index="0" text="Bryson City" class="android.widget.EditText" package="com.demo.pass" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="true" scrollable="false" long-clickable="true" password="false" selected="false" bounds="[30,145][510,196]" resource-id="com.demo.pass:id/autoCompleteSearchTextView" instance="0" />
    <android.widget.ImageView NAF="true" index="1" text="" class="android.widget.ImageView" package="com.demo.pass" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[457,148][502,193]" resource-id="com.demo.pass:id/imgCurrentLocation" instance="0" />
</android.widget.FrameLayout>

想了想,我尝试了键盘操作。我可以使用以下代码导航到该值

ad.pressKeyCode(20);

但我无法挖掘价值。我已经尝试了大部分事情。喜欢:-

ad.pressKeyCode(66); // Press Enter 

TouchAction action = new TouchAction(ad);
action.perform();

由于 DOM 上没有用于下拉值的定位器,因此我无法在上述代码中传递元素。

由于有名称作为框架,我也尝试使用以下代码进行切换:-

ad.switchTo().frame(ad.findElement(By.xpath("com.demo.pass:id/frameSearchLocation")));

uiautomatorviewer 屏幕:-

请建议我在这种情况下应该怎么做。 任何解决方案/建议将不胜感激。

【问题讨论】:

  • 这是一款混合应用吗?在这种情况下,switchingContext 可能会帮助您找到该元素。 appium.io/slate/en/master/?java#automating-hybrid-apps
  • nup 它是基于 java android 构建的 ..
  • 从外观上看,您访问的上下文似乎并不完全是原生的。在这个屏幕上,您能否尝试获取 contextHandles 以检查 appium 列出的所有内容。它将更好地证明可用的上下文以及是否需要切换。
  • 我试过下面的代码:-
  • ArrayList contextName = new ArrayList(); //设置 contextName = ad.getContextHandles(); System.out.println(contextName); for (String contexts : contextName) { System.out.println(contexts); if (contextName.contains("NATIVE_APP")) { System.out.println("给我看:" + contextName);线程.sleep(1500); ad.context("NATIVE_APP"); ad.findElement(By.xpath("//*[@text='Bryson City, NC']")).click(); } if (contextName.contains("WEBVIEW")) { ad.context("WEBVIEW"); ad.findElement(By.xpath("//*[@text='Bryson City, NC']")).click(); }

标签: java selenium-webdriver appium appium-android


【解决方案1】:

这是一个已知问题。从过去 2 年开始,我一直在做 Android 应用测试自动化。我多次遇到同样的问题。不幸的是,uiAutomator 没有检测到此类元素,因此我们无法对此类元素执行任何操作。

Appium 在内部向 uiAutomator 发送命令,然后 uiAutomatar 在设备上执行操作。如果 uiAutomator 看到这些元素,uiAutomator 就可以执行操作。

所以我建议你不要花太多时间在使用 TouchAction/java script/pagesource 或 xPath 上,因为我已经尝试过软管解决方案,但都没有奏效。

但是,如果元素每次都出现在同一位置,您可以使用坐标单击元素(如果下拉菜单中的元素不断变化,则不建议使用)。

【讨论】:

  • 谢谢 Vinod .. 我已经使用坐标完成了它,但正在寻找一个更强大的替代方案,因为你无法中继协调员 .. 即使我无法验证 drop-降低存在,因此当它开始弹出错误故障时,它会使自动化更加危险
  • 如果 Google 发布了新版本的 UiAutomator,我们可以检查更新版本。到目前为止,还没有办法检测到这些元素。
【解决方案2】:

下面的代码对我有用

        By filter =By.xpath("MYLOCATOR");
        System.out.println("About to click on result");
        Point point = ad.findElement(filter).getLocation();
        int elementCenterX = point.getX() + 80;
        int elementCenterY = point.getY() + 100;
        System.out.println("value of x = "+elementCenterX+"   value of y = "+elementCenterY);
        ad.tap(2, elementCenterX , elementCenterY , 0);

注意:- 您需要根据上述代码中的要求调整 X 和 Y,并传递最近的定位器,如下拉列表的文本框。

【讨论】:

    猜你喜欢
    • 2018-11-06
    • 2015-12-07
    • 2019-03-10
    • 2017-01-10
    • 1970-01-01
    • 2020-10-05
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    相关资源
    最近更新 更多