UIAumator работает с Android Timepicker

Я пытаюсь выполнить тестирование пользовательского интерфейса для выбора времени Android.

Я использую эспрессо, которое не может подключиться к компоненту этого типа, и в соответствии с документацией, которую я должен использовать UIAutomator, Я могу поймать кнопку OK/ Отмена, используя следующий API

mDevice.findObject(new UiSelector().text("OK")).click();

Однако, когда я пытаюсь установить время и час, я продолжаю получать UiObjectNotFoundException,

Кому-нибудь удалось установить время с этим API? Спасибо

1 ответ

Я приведу пример того, как этого можно достичь с помощью AndroidViewClient/culebra, который, в свою очередь, косвенно использует UiAutomator.

Я начал генерировать базовый тестовый скрипт с culebra который я позже настроил (с тем же экраном, что и на скриншоте). К сожалению, графический интерфейс Culebra пока не генерирует такие сложные тесты, но автоматически сгенерированный тест - отличное место для начала.

$ culebra -d true -i true -CVLU -o ~/tmp/time-picker.py

Вы можете узнать больше о вариантах выполнения culebra --help но в основном -d говорит использовать описания контента, -i использовать идентификаторы для и некоторые параметры ведения журнала, а затем выходной файл.

Затем я отредактировал автоматически сгенерированный файл, чтобы он выглядел следующим образом (я добавил комментарий, чтобы сделать его понятным)

#! /usr/bin/env python
# -*- coding: utf-8 -*-
'''
Copyright (C) 2013-2014  Diego Torres Milano
Created on 2016-02-19 by Culebra v11.5.1
                      __    __    __    __
                     /  \  /  \  /  \  /  \ 
____________________/  __\/  __\/  __\/  __\_____________________________
___________________/  /__/  /__/  /__/  /________________________________
                   | / \   / \   / \   / \   \___
                   |/   \_/   \_/   \_/   \    o \ 
                                           \_____/--<
@author: Diego Torres Milano
@author: Jennifer E. Swofford (ascii art snake)
'''


import re
import sys
import os


import unittest


try:
    sys.path.insert(0, os.path.join(os.environ['ANDROID_VIEW_CLIENT_HOME'], 'src'))
except:
    pass

from com.dtmilano.android.viewclient import ViewClient, CulebraTestCase

TAG = 'CULEBRA'


class CulebraTests(CulebraTestCase):

    @classmethod
    def setUpClass(cls):
        cls.kwargs1 = {'ignoreversioncheck': False, 'verbose': True, 'ignoresecuredevice': False}
        cls.kwargs2 = {'forceviewserveruse': False, 'useuiautomatorhelper': False, 'ignoreuiautomatorkilled': True, 'autodump': False, 'startviewserver': True, 'compresseddump': True}
        cls.options = {'start-activity': None, 'concertina': False, 'device-art': None, 'use-jar': False, 'multi-device': False, 'unit-test-class': True, 'save-screenshot': None, 'use-dictionary': False, 'glare': False, 'dictionary-keys-from': 'id', 'scale': 0.5, 'find-views-with-content-description': True, 'window': -1, 'orientation-locked': None, 'save-view-screenshots': None, 'find-views-by-id': True, 'log-actions': True, 'use-regexps': False, 'null-back-end': False, 'auto-regexps': None, 'do-not-verify-screen-dump': False, 'verbose-comments': True, 'gui': False, 'find-views-with-text': True, 'prepend-to-sys-path': True, 'install-apk': None, 'drop-shadow': False, 'output': '/home/diego/tmp/time-picker.py', 'unit-test-method': None, 'interactive': False}
        cls.sleep = 5

    def setUp(self):
        super(CulebraTests, self).setUp()

    def tearDown(self):
        super(CulebraTests, self).tearDown()

    def preconditions(self):
        if not super(CulebraTests, self).preconditions():
            return False
        return True

    def testSomething(self):
        if not self.preconditions():
            self.fail('Preconditions failed')

        _s = CulebraTests.sleep
        _v = CulebraTests.verbose

        self.device.Log.d(TAG, "dumping content of window='-1'",  _v)
        self.vc.dump(window='-1')


        # class=android.widget.TextView  text=u'10'
        self.device.Log.d(TAG, "finding view with id=android:id/hours",  _v)
        android___id_hours = self.vc.findViewByIdOrRaise("android:id/hours")

        # class=android.widget.TextView  text=u'30'
        self.device.Log.d(TAG, "finding view with id=android:id/minutes",  _v)
        android___id_minutes = self.vc.findViewByIdOrRaise("android:id/minutes")

        # class=android.view.View
        #self.device.Log.d(TAG, "finding view with id=android:id/radial_picker",  _v)
        #android___id_radial_picker = self.vc.findViewByIdOrRaise("android:id/radial_picker")

        # class=android.widget.RadialTimePickerView$RadialPickerTouchHelper  cd='0'
        hs = {}
        for h in range(0, 24):
            self.device.Log.d(TAG, "finding view with cd %s" % h,  _v)
            hs[h] = self.vc.findViewWithContentDescriptionOrRaise(u'''%s''' % h)

        # class=android.widget.Button  text=u'Cancel'
        self.device.Log.d(TAG, "finding view with text Cancel",  _v)
        android___id_button2 = self.vc.findViewWithTextOrRaise(u'Cancel')

        # class=android.widget.Button  text=u'OK'
        self.device.Log.d(TAG, "finding view with text OK",  _v)
        android___id_button1 = self.vc.findViewWithTextOrRaise(u'OK')

        # Set time (for example 12:15)
        self.device.Log.d(TAG, "setting hour to 12",  _v)
        hs[12].touch()

        # Verify hour
        self.device.Log.d(TAG, "dumping content of window='-1'",  _v)
        self.vc.dump(window='-1')

        # class=android.widget.TextView  text=u'12'
        self.device.Log.d(TAG, "finding view with id=android:id/hours",  _v)
        android___id_hours = self.vc.findViewByIdOrRaise("android:id/hours")

        self.device.Log.d(TAG, "checking hour set to 12",  _v)
        self.assertEqual(android___id_hours.getText(), u'12')

        # update
        self.device.Log.d(TAG, "dumping content of window='-1'",  _v)
        self.vc.dump(window='-1')


        ms = {}
        for m in range(0, 60, 5):
            m0 = '%02d' % m
            self.device.Log.d(TAG, "finding view with cd %s" % m0,  _v)
            ms[m] = self.vc.findViewWithContentDescriptionOrRaise(u'''%s''' % m)

        ms[15].touch()

        # Verify minute
        self.device.Log.d(TAG, "dumping content of window='-1'",  _v)
        self.vc.dump(window='-1')

        # class=android.widget.TextView  text=u'15'
        self.device.Log.d(TAG, "finding view with id=android:id/minutes",  _v)
        android___id_minutes = self.vc.findViewByIdOrRaise("android:id/minutes")
        self.assertEqual(android___id_minutes.getText(), u'15')


        self.device.Log.d(TAG, "finding view with text Cancel",  _v)
        android___id_button2 = self.vc.findViewWithTextOrRaise(u'Cancel')

        # let's cancel, so time is not set
        android___id_button2.touch()

if __name__ == '__main__':
    CulebraTests.main()

Тест состоит из следующих основных частей:

  1. проверка того, что отправной точкой является указатель времени (в противном случае произойдет сбой)
  2. получение всех часов просмотров
  3. установка часа до 12
  4. проверяя, что 12 было установлено
  5. получение всех минут просмотров
  6. установка минут до 15
  7. проверка того, что 15 было установлено
  8. Касаясь отмены, чтобы избежать установки времени

Из-за параметров ведения журнала вы получаете этот вывод при запуске с -v:

$ ~/tmp/time-picker.py -v

testSomething (__main__.CulebraTests) ... Connecting to a device with serialno=.* with a timeout of 60 secs...
Connected to device with serialno=.*
Actual device serialno=XXXXXXXXXXX
CULEBRA: dumping content of window='-1'
CULEBRA: finding view with id=android:id/hours
CULEBRA: finding view with id=android:id/minutes
CULEBRA: finding view with cd 0
CULEBRA: finding view with cd 1
CULEBRA: finding view with cd 2
CULEBRA: finding view with cd 3
CULEBRA: finding view with cd 4
CULEBRA: finding view with cd 5
CULEBRA: finding view with cd 6
CULEBRA: finding view with cd 7
CULEBRA: finding view with cd 8
CULEBRA: finding view with cd 9
CULEBRA: finding view with cd 10
CULEBRA: finding view with cd 11
CULEBRA: finding view with cd 12
CULEBRA: finding view with cd 13
CULEBRA: finding view with cd 14
CULEBRA: finding view with cd 15
CULEBRA: finding view with cd 16
CULEBRA: finding view with cd 17
CULEBRA: finding view with cd 18
CULEBRA: finding view with cd 19
CULEBRA: finding view with cd 20
CULEBRA: finding view with cd 21
CULEBRA: finding view with cd 22
CULEBRA: finding view with cd 23
CULEBRA: finding view with text Cancel
CULEBRA: finding view with text OK
CULEBRA: setting hour to 12
CULEBRA: dumping content of window='-1'
CULEBRA: finding view with id=android:id/hours
CULEBRA: checking hour set to 12
CULEBRA: dumping content of window='-1'
CULEBRA: finding view with cd 00
CULEBRA: finding view with cd 05
CULEBRA: finding view with cd 10
CULEBRA: finding view with cd 15
CULEBRA: finding view with cd 20
CULEBRA: finding view with cd 25
CULEBRA: finding view with cd 30
CULEBRA: finding view with cd 35
CULEBRA: finding view with cd 40
CULEBRA: finding view with cd 45
CULEBRA: finding view with cd 50
CULEBRA: finding view with cd 55
CULEBRA: dumping content of window='-1'
CULEBRA: finding view with id=android:id/minutes
CULEBRA: finding view with text Cancel
ok

----------------------------------------------------------------------
Ran 1 test in 21.399s

OK

надеюсь, это поможет вам

Другие вопросы по тегам