Обеспечение задержки между событиями в 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();
Другие вопросы по тегам