問題描述
我有以下腳本,用于在 Android 中使用 UiAutomator 在計算器中輸入33".但是,只接受第一個 '3',第二次按下完全被忽略.
I have the following script for typing '33' into the Calculator, in Android, using UiAutomator. However, only the first '3' is accepted, the second press is entirely ignored.
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 秒,方法是:
I've tried adding a sleep for 2 seconds after the first click, by doing:
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
...但這并沒有改變任何東西.
... but that didn't change anything.
我還嘗試在 2 個 '3' 之間單擊另一個按鈕,即:
I also tried clicking on a different button, in between the 2 '3's, ie:
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 上運行)
(Note: using Android 4.1.2, in an AVD; running on Ubuntu linux 12.04)
編輯,根據 Rami 的觀察,我嘗試了以下方法,以重復使用相同的 UiObject 對象來獲得相同描述的第二次請求:
Edit, following Rami's observations, I tried the following, to reuse the same UiObject object for a second request for the same description:
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] 創建新對象".
... but it didn't work, even though it is clearly reusing the same UiObject each time, because it only says 'Created new object for [3]' once.
然后我嘗試了 UiDevice.click() 'trick',通過創建一個函數 'click' 如下,再次遵循 Rami 的觀察:
Then I tried the UiDevice.click() 'trick', by creating a function 'click' as follows, again, following Rami's observations:
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 都顯示正常.
However, this didn't work for me either: only the first '3' appears, and the second is ignored, even though both clicks are clearly in the same place, because the rect:
output locations are identical. If I click '3' twice manually, using my own desktop mouse, then both 3s appear ok.
我還嘗試在兩次點擊之間添加兩秒 Thread.sleep()
,但我仍然只出現了一個3".
I also tried adding a two second Thread.sleep()
between the clicks, and still only a single '3' appeared for me.
推薦答案
不要只按文本搜索,而是嘗試按文本和類搜索.這是執行此操作的示例方法.
Instead of just searching by text, try searching by the text and the class. Here is a sample method for doing so.
Uiobject getByTextAndClass(String text, String className) {
return new UiObject(new UiSelector().text(text).className(className));
}
然后,如果您嘗試為帶有數字 3 的計算器按鈕調用此方法:
And then if you are trying to call this method for the Calculator button with number 3 on it:
getByTextAndClass("3", android.widget.Button.class.getName()).click();
您可以使用 UiAutomatorViewer 工具:{android-sdk}/tools/uiautomator.bat 查看不同 UiObject 的類名和其他屬性.
You can use the UiAutomatorViewer tool: {android-sdk}/tools/uiautomator.bat to check the classnames and other attributes of different UiObjects.
這適用于我的 4.2.2 設備,但我正在下載 4.1.2 以在那里進行測試.
This works on my 4.2.2 devices, but I am downloading 4.1.2 to test it on there as well.
我在 4.1.2 AVD 上嘗試過,它可以在我的 Windows 機器上運行.
I tried it on a 4.1.2 AVD and it works on my Windows machine.
這篇關于如何使用 Google UiAutomator 按兩次按鈕?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!