如何点击 appium 中聚焦的元素。无法 select appium 中下拉菜单的值
How to tap on a element which is focused in appium. Unable to select value of a dropdown in appium
我遇到了下拉值元素未在 uiautomatorviewer 中显示的问题。
虽然我检查了 XML DOM by getPageSource
的屏幕,但移动应用程序屏幕上显示的结果也没有任何价值
XML 片段如下:-
<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 屏幕:-
请建议我在这种情况下应该怎么做。
任何 solution/suggestions 将不胜感激。
这是一个已知问题。从过去 2 年开始,我一直在做 Android 应用程序测试自动化。我多次遇到同样的问题。不幸的是,uiAutomator 不会检测到此类元素,因此我们无法对此类元素执行任何操作。
Appium 在内部向 uiAutomator 发送命令,然后 uiAutomatar 在设备上执行操作。如果 uiAutomator 看到这些元素,uiAutomator 可以执行操作。
所以我建议您不要花太多时间使用 TouchAction/java 脚本/页面源或 xPath,因为我已经尝试过软管解决方案,但其中 none 有效。
但是,如果元素每次都出现在同一位置,则可以使用坐标单击元素(如果下拉列表中的元素不断变化,则不建议这样做)。
下面的代码适合我
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,并传递最近的定位器,例如下拉列表的文本框。
我遇到了下拉值元素未在 uiautomatorviewer 中显示的问题。
虽然我检查了 XML DOM by getPageSource
的屏幕,但移动应用程序屏幕上显示的结果也没有任何价值
XML 片段如下:-
<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 屏幕:-
请建议我在这种情况下应该怎么做。 任何 solution/suggestions 将不胜感激。
这是一个已知问题。从过去 2 年开始,我一直在做 Android 应用程序测试自动化。我多次遇到同样的问题。不幸的是,uiAutomator 不会检测到此类元素,因此我们无法对此类元素执行任何操作。
Appium 在内部向 uiAutomator 发送命令,然后 uiAutomatar 在设备上执行操作。如果 uiAutomator 看到这些元素,uiAutomator 可以执行操作。
所以我建议您不要花太多时间使用 TouchAction/java 脚本/页面源或 xPath,因为我已经尝试过软管解决方案,但其中 none 有效。
但是,如果元素每次都出现在同一位置,则可以使用坐标单击元素(如果下拉列表中的元素不断变化,则不建议这样做)。
下面的代码适合我
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,并传递最近的定位器,例如下拉列表的文本框。