Обеспечение задержки между событиями в UiAutomator Android
Как я могу обеспечить задержку между щелчками событий в UiAutomator Android.
Первое событие вводит URL в EditText:
new UiObject(new UiSelector().text("Search here")).setText("abc.com");
getUiDevice.waitForIdle(15000);
Здесь я загружаю веб-страницу внутри веб-просмотра. Поэтому, когда загрузка URL заканчивается, мне нужно проверить наличие второго события.
Второе событие - проверка содержимого описания объекта:
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)
Но я не знаю, как использовать эти методы.
Пожалуйста, предложите мне пример, как использовать их.
Любая помощь будет оценена.
Спасибо!
9 ответов
Попробуй просто
sleep(5000);
Дайте мне знать, работает ли это. Или вы можете попробовать метод WaitForIdle().
Если вам нужно подождать после нажатия кнопки
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));
public boolean waitForWindowUpdate(null, long timeout)
Работает хорошо для меня. Я думаю, что можно принести любое "не существует" String packagaName
, например "blablabla"
потому что вы можете получить null
вместо String packageName
,
Я создал простой способ сделать задержку:
public void waitTime(int time) {
getUiDevice().waitForWindowUpdate(null, time);
}
Надеюсь, это полезно.
Я не эксперт в UIautomator, но это можно сделать с помощью Thread.sleep().
UiDevice
предоставляет несколько методов, которые могут работать для вас:
public void waitForIdle(long timeout)
public void waitForIdle()
public boolean waitForWindowUpdate(String packageName, long timeout)
Я думаю TimeUnit.SECONDS.sleep(val);
должно быть полезно здесь
например
import java.util.concurrent.TimeUnit;
private void waitFor(long val)
{
try
{
TimeUnit.SECONDS.sleep(val);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
Это должно работать
У меня был случай, когда мне пришлось ждать диалогового окна 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();
}
}
Это будет ждать появления диалогового окна, и если оно появится, оно будет закрыто.
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();
}
});
Загрузите ваш URL, тогда есть метод onPageFinished(), где вы можете обрабатывать свой код.
Единственный способ, которым я смог добавить задержку в код 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();