2013-08-12 4 views
3

У меня есть большой опыт работы с uiautomator от Google; Тем не менее, я, похоже, сильно обеспокоен добавлением виджета на главный экран телефона. Пока давайте держим его простым и предположим, что экран, на который добавлен виджет, пуст. Мысленный процесс должен состоять в том, чтобы открыть ящик приложения> щелкнуть вкладку виджетов> найти добавленный виджет> длинный щелчок и перетащить виджет на главный экран. Похоже, что виджеты не являются «длинными кликами». Любые мысли/предложения/решения будут оценены. Код, который я выполнил, приведен ниже.UiAutomator - добавление виджета на главный экран

@Override 
protected void setUp() throws UiObjectNotFoundException { 
    getUiDevice().pressHome(); 

    new UiObject(new UiSelector().className(TEXT_VIEW).description("Apps")).clickAndWaitForNewWindow(); 
    new UiObject(new UiSelector().className(TEXT_VIEW).text("Widgets")).click(); 

    UiScrollable widgets = new UiScrollable(new UiSelector().scrollable(true)); 
    widgets.setAsHorizontalList(); 
    widgets.flingToEnd(MAX_SWIPES); 

    UiObject widget = widgets.getChildByText(
      new UiSelector().className(TEXT_VIEW).resourceId("com.android.launcher:id/widget_name"), 
      WIDGET_NAME 
    ); 

    // Returns true 
    System.out.println("exists(): " + widget.exists()); 
    // Returns false... 
    System.out.println("longClickable(): " + widget.isLongClickable()); 

    widget.longClick(); 

    // Also tried... 
    int startX = sonosWidget.getVisibleBounds().centerX(); 
    int startY = sonosWidget.getVisibleBounds().centerY(); 
    getUiDevice().drag(startX, startY, 0, 0, 3); 
} 
+0

Возможный дубликат: http://stackoverflow.com/questions/32111654 - Я хотел бы услышать результаты ваших усилий - вы, кажется, намного ближе меня! – Nilzor

+0

Я полагаю, что решение не найдено здесь? : -/ –

ответ

0

Продолжительное нажатие на uiautomator Android также могут быть выполнены с помощью:

public boolean drag (int startX, int startY, int endX, int endY, int steps) 

Выполняет красть от одной координаты к другой координате. Вы можете контролировать гладкость и скорость прокрутки, указав количество шагов. Каждое выполнение шага дросселируется до 5 миллисекунд на каждый шаг, поэтому для 100 шагов салфетка займет около 0,5 секунды.

Параметры:

StartX :: Значение X-ось для запуска координатных

startY :: значения Y-ось для начальной координатой

EndX :: значения по оси Х для концовки координировать

Endy :: значение Y-ось для конечной координаты

шагов :: число шагов для действия салфетки.

Возвращает:

верно, если коромысло выполняется, ложь, если операция не выполняется или координаты являются недопустимыми.

С:

Android Уровень API 18

Так дайте (StartX, startY) = (EndX, Endy). Это действовало бы эквивалентно длинному щелчку.

+1

Я дам вам попытку и дам вам знать, если это сработает. –

+0

Это не работает, я считаю, что это происходит потому, что перед тем, как перетащить, элемент нужно сначала сжать, а не drag(). Спасибо вам за предложение. –

+1

Я думаю, что 'public boolean swipe (Point [] segment, int segmentSteps)' с тремя точками в сегментах может работать лучше.Тогда первые 2 точки в сегментах могут быть идентичными (имитируя длительное нажатие), а затем виджет перетаскивается в следующую точку. – Anders

-2

вы можете использовать dragTo (объект же пользовательский интерфейс, шаги)

* шаги должны быть> 100, чтобы убедиться, нажмите достаточно

1

долго Используя Anders идею, мне удалось долгое нажатие на виджет и перетащите это где-то на дому, но потом я вижу свою конфигурационную деятельность кратко, прежде чем вернуться к списку виджетов :((Kolin код)

@Before fun setWidgetOnHome() { 
    mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) 
    val screenSize = Point(mDevice.displayWidth, mDevice.displayHeight) 
    val screenCenter = Point(screenSize.x/2, screenSize.y/2) 

    mDevice.pressHome() 

    val launcherPackage = mDevice.launcherPackageName!! 
    mDevice.wait(Until.hasObject(By.pkg(launcherPackage).depth(0)), LAUNCH_TIMEOUT) 

    // attempt long press 
    mDevice.swipe(arrayOf(screenCenter, screenCenter), 150) 
    pauseTest(2000) 

    mDevice.findObject(By.text("Widgets")).click() 
    mDevice.waitForIdle() 

    val y = screenSize.y/2 

    var widget = mDevice.findObject(By.text("Efficio")) 
    var additionalSwipe = 1 
    while (widget == null || additionalSwipe > 0) { 
     mDevice.swipe(screenCenter.x, y, screenCenter.x, 0, 150) 
     mDevice.waitForIdle() 
     if (widget == null) { 
      widget = mDevice.findObject(By.text("Efficio")) 
     } else { 
      additionalSwipe-- 
     } 
    } 
    val b = widget.visibleBounds 
    val c = Point(b.left + 150, b.bottom + 150) 
    val dest = Point(c.x + 250, c.y + 250) 
    mDevice.swipe(arrayOf(c, c, dest), 150) 
} 

Я считаю, что что-то происходит, но то, что: -/это как спина щелкнули

+1

Поскольку этот вопрос был старый, я открыл еще один вопрос, и выясняется, что этот код выше работает, но по окончании моего теста конец теста убивает мою конфигурационную активность. Добавление клика по кнопке ok моей деятельности по настройке правильно установит виджет! –