如何使用Google UiAutomator按两次按钮?
作者:互联网
我使用以下脚本在Android中的计算器中使用UiAutomator键入“33”.但是,只接受第一个’3′,第二个按下完全被忽略.
import com.android.uiautomator.core.*;
import com.android.uiautomator.testrunner.UiAutomatorTestCase;
public class MyFirstUiAutomatorTest extends UiAutomatorTestCase {
UiObject getByDescription(String description) {
return new UiObject(new UiSelector().description(description));
}
UiObject getByText(String description) {
return new UiObject(new UiSelector().text(description));
}
UiObject scrollableGetByText(String text ) throws UiObjectNotFoundException {
UiScrollable uiScrollable = new UiScrollable(new UiSelector().scrollable(true));
uiScrollable.setAsHorizontalList();
return uiScrollable.getChildByText(new UiSelector().className(
android.widget.TextView.class.getName()),
text);
}
public void testStuff() throws UiObjectNotFoundException {
getUiDevice().pressHome();
getByDescription("Apps").clickAndWaitForNewWindow();
getByText("Apps").click();
scrollableGetByText("Calculator").clickAndWaitForNewWindow();
// pressing '+' and '=' effectively clears the previous input
getByText("+").click();
getByText("=").click();
getByText("3").click();
// this second '3' is ignored
getByText("3").click();
}
}
我在第一次点击后尝试添加睡眠2秒,方法是:
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
……但这并没有改变任何事情.
我也尝试在2’3之间点击一个不同的按钮,即:
new UiObject(new UiSelector().text("3")).click();
new UiObject(new UiSelector().className("android.widget.EditText")).click();
new UiObject(new UiSelector().text("3")).click();
……但那也没有用.
想法?
(注意:在AVD中使用Android 4.1.2;在Ubuntu linux 12.04上运行)
编辑,按照Rami的观察,我尝试了以下操作,为同一描述的第二个请求重用相同的UiObject对象:
HashMap<String,UiObject> objectByText = new HashMap<String,UiObject>();
UiObject getByText(String description) {
if( objectByText.containsKey(description)) {
System.out.println("" + objectByText.get(description) );
return objectByText.get(description);
}
System.out.println("Created new object for [" + description + "]");
UiObject object = new UiObject(new UiSelector().text(description));
objectByText.put(description, object );
System.out.println("" + object );
return object;
}
…但它没有用,即使它每次都明显重复使用相同的UiObject,因为它只会说“为[3]创建一个新对象”.
然后我尝试了UiDevice.click()’技巧’,再次按照Rami的观察创建一个函数’click’,如下:
void click(UiObject target ) throws UiObjectNotFoundException {
Rect rect = target.getBounds();
System.out.println("rect: " + rect );
getUiDevice().click(rect.centerX(), rect.centerY());
}
但是,这对我来说也不起作用:只有第一个’3’出现,第二个被忽略,即使两个点击明显在同一个地方,因为rect:输出位置是相同的.如果我手动点击“3”,使用我自己的桌面鼠标,则两个3都显示正常.
我还尝试在点击之间添加两秒Thread.sleep(),但仍然只有一个’3’出现在我面前.
解决方法:
不只是按文本搜索,而是尝试按文本和类进行搜索.
这是一个这样做的示例方法.
Uiobject getByTextAndClass(String text, String className) {
return new UiObject(new UiSelector().text(text).className(className));
}
然后,如果您尝试为其上带有数字3的计算器按钮调用此方法:
getByTextAndClass("3", android.widget.Button.class.getName()).click();
您可以使用UiAutomatorViewer工具:{android-sdk} /tools/uiautomator.bat来检查不同UiObjects的类名和其他属性.
这适用于我的4.2.2设备,但我也在下载4.1.2以在那里进行测试.
我在4.1.2 AVD上试过它,它可以在我的Windows机器上运行.
标签:android,java,automated-tests,avd,android-uiautomator 来源: https://codeday.me/bug/20191006/1862797.html