如何在UiAutomator Android中提供事件点击之间的延迟。
第一个事件是在EditText中输入网址:
new UiObject(new UiSelector().text("Search here")).setText("abc.com");
getUiDevice.waitForIdle(15000);
这里我在webview中加载一个网页。所以当网址加载完成后,我需要检查第二个事件。
第二个事件是检查对象的内容描述:
UiObject curClass = new UiObject(new UiSelector().className("android.widget.RelativeLayout"));
UiObject yCur = curClass.getChild(new UiSelector().description("ye"));
getCurCol();
public void getCurCol() throws UiObjectNotFoundException {
try {
if (yCur.getContentDescription() != null)
report.append("Success");
} catch (Exception e) {
System.err.println("\nCaught Exception: " + e.getMessage());
}
但这似乎没有用。
我只是希望应用程序在检查第二个事件之前等待一段时间。
我知道这两种方法是为UI Automator中的延迟提供的 -
public void waitForIdle(long timeout)
public void waitForIdle()
public boolean waitForWindowUpdate(String packageName, long timeout)
但我不知道如何使用这些方法。
请为我推荐一个如何使用它们的例子。
任何帮助都将不胜感激。
谢谢!
答案 0 :(得分:10)
尝试
sleep(5000);
让我知道它是否有效。或者你可以尝试WaitForIdle()方法。
答案 1 :(得分:3)
public boolean waitForWindowUpdate(null, long timeout)
对我有用。我认为可以带来任何不存在的' String packagaName
,例如。 "blablabla"
,因为您可以获得null
而不是String packageName
。
我创造了一种简单的延迟方法:
public void waitTime(int time) {
getUiDevice().waitForWindowUpdate(null, time);
}
希望这有用。
答案 2 :(得分:2)
按下按钮后需要等待
UiObject settingsButton = mDevice.findObject(new UiSelector().text("Settings"));
settingsButton.clickAndWaitForNewWindow();
或
settingsButton.waitUntilGone(1000);
如果从意图启动新活动,这种方式最容易找到,等待设置包出现:
mDevice.wait(Until.hasObject(By.pkg("com.android.settings").depth(0)), 2000);
UiObject settingsValidation = mDevice.findObject(new UiSelector().packageName("com.android.settings").text("Settings"));
assertTrue("Unable to detect Settings", settingsValidation.waitForExists(4000));
答案 3 :(得分:1)
UiDevice
提供了一些可能适合您的方法:
public void waitForIdle(long timeout)
public void waitForIdle()
public boolean waitForWindowUpdate(String packageName, long timeout)
答案 4 :(得分:1)
我不是UIautomator的专家,但这可以通过Thread.sleep()完成。
答案 5 :(得分:1)
我认为TimeUnit.SECONDS.sleep(val);
应该对此有所帮助
import java.util.concurrent.TimeUnit;
private void waitFor(long val)
{
try
{
TimeUnit.SECONDS.sleep(val);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
这应该有效
答案 6 :(得分:0)
webView.loadUrl("http://abc.com");
webView.setWebChromeClient(new WebChromeClient());
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
// TODO Auto-generated method stub
super.onPageStarted(view, url, favicon);
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
//Handle your code here
//Toast.makeText(TableContentsWithDisplay.this, "Width " + view.getWidth() +" *** " + "Height " + view.getHeight(), Toast.LENGTH_SHORT).show();
}
@Override
public void onReceivedSslError(WebView view,
SslErrorHandler handler, SslError error) {
// TODO Auto-generated method stub
super.onReceivedSslError(view, handler, error);
//Toast.makeText(TableContentsWithDisplay.this, "error "+error, Toast.LENGTH_SHORT).show();
}
});
加载您的网址然后有方法onPageFinished(),您可以在其中处理您的代码。
答案 7 :(得分:0)
我有一个案例,我必须等待Smart Lock对话框并找到解雇它的方法。
我最终做了以下
final UiDevice mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
// Wait for the Smart Lock dialog to popup
if(mDevice.waitForWindowUpdate(null, 5000)) {
if("com.google.android.gms".equals(mDevice.getCurrentPackageName())) {
// Dismiss dialog
mDevice.pressBack();
}
}
这将等待对话框出现,如果它会被取消。
答案 8 :(得分:0)
我能够在 UIAutomator 代码中添加延迟的唯一方法与 slott 的回答类似:
我基本上吃了一个小应用程序(来自 android 示例的基本应用程序),然后按回关闭它。这为所有元素正确加载留出时间。
Context context = getApplicationContext();
final Intent intent = context.getPackageManager()
.getLaunchIntentForPackage(BASIC_SAMPLE_PACKAGE);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); // Clear out any previous instances
context.startActivity(intent);
// Wait for the app to appear
mDevice.wait(Until.hasObject(By.pkg(BASIC_SAMPLE_PACKAGE).depth(0)), LAUNCH_TIMEOUT);
//then close this small app
mDevice.pressBack();