Нажатие кнопок «текстом» в приложении Android с помощью Culebra

У меня есть приложение для Android, которое я пытаюсь протестировать с помощью culebra. Код показан ниже.

'''reated on 2017-02-08 by Culebra v12.5.3
                      __    __    __    __
                     /  \  /  \  /  \  /  \ 
____________________/  __\/  __\/  __\/  __\_____________________________
___________________/  /__/  /__/  /__/  /________________________________
                   | / \   / \   / \   / \   \___
                   |/   \_/   \_/   \_/   \    o \ 
                                           \_____/--<
@author: Diego Torres Milano
@author: Jennifer E. Swofford (ascii art snake)
'''


import re
import sys
import os


from com.dtmilano.android.viewclient import ViewClient
from com.dtmilano.android.adb.adbclient import DOWN_AND_UP

kwargs1 = {'ignoreversioncheck': False, 'verbose': False, 'ignoresecuredevice': False}
device, serialno = ViewClient.connectToDeviceOrExit(**kwargs1)
kwargs2 = {'forceviewserveruse': False, 'useuiautomatorhelper': False, 'ignoreuiautomatorkilled': True, 'autodump': False, 'startviewserver': True, 'compresseddump': True}
vc = ViewClient(device, serialno, **kwargs2)

# Installs the Android package. Notice that this method returns a boolean, so you can test
# to see if the installation worked.
vc.installPackage('Abc App.Android.Abc App.Android-Signed.apk')


# sets a variable with the package's internal name
package = 'Abc App.Android.Abc App.Android'

# sets a variable with the name of an Activity in the packag
activity = 'md591ecfcc00ede54e89ae8714.MainActivity'

# sets the name of the component to start
runComponent = package + '/' + activity

# Runs the component
device.startActivity(component=runComponent)

vc.sleep(5)

#vc = ViewClient(device)
vc.dump()

for bt in [ 'PRO', 'FIE', 'DIA']:
    b = vc.findViewWithAttribute('text:mText', bt)
    if b:
        (x, y) = b.getXY()
        print >>sys.stderr, "clicking b%s @ (%d,%d) ..." % (bt, x, y)
        b.touch()

    time.sleep(7)


# Presses the Menu button
# device.press('KEYCODE_MENU', DOWN_AND_UP)

# Writes the screenshot to a file (you can use a plain filename or use these placeholders)
vc.writeImageToFile('/tmp/${serialno}-${focusedwindowname}-${timestamp}.png', 'PNG')

Когда я запускаю приведенный выше скрипт как

$ python test_culebra.py

Я получаю следующую ошибку.

[100%] /data/local/tmp/AbcApp.Android.AbcApp.Android-Signed.apk
        pkg: /data/local/tmp/AbcApp.Android.AbcApp.Android-Signed.apk
Success
Traceback (most recent call last):
  File "monkey_runner_culebra.py", line 53, in <module>
    print >>sys.stderr, "clicking b%s @ (%d,%d) ..." % (bt, x, y)
NameError: name 'x' is not defined

Он устанавливает и загружает приложение. Однако он не может найти кнопку с текстом PRO',FIE,DIA` и т. д.

Что я делаю неправильно здесь.


person liv2hak    schedule 10.02.2017    source источник
comment
Кажется, что b.getXY() не возвращает координаты представления. Убедитесь, что b содержит то, что вы ожидаете.   -  person Diego Torres Milano    schedule 10.02.2017
comment
Кроме того, используйте culebra или culebra -G для создания касания для одного случая, а затем вы можете превратить его в цикл. Таким образом, у вас будет правильный синтаксис.   -  person Diego Torres Milano    schedule 10.02.2017
comment
@DiegoTorresMilano - как мне использовать culbera -G внутри скрипта Python?   -  person liv2hak    schedule 10.02.2017
comment
Извините, было недостаточно ясно. Я не говорю, что вы можете использовать culebra -G внутри своего скрипта, но вы можете запустить его, а затем вырезать и вставить новый сгенерированный код.   -  person Diego Torres Milano    schedule 10.02.2017


Ответы (1)


Бежать

culebra -Gu -o myscript.py --scale=0.5

вы увидите окно, представляющее ваше устройство, очень похожее на

введите здесь описание изображения

затем вы нажимаете на кнопки (здесь я запускаю ApiDemos), и culebra генерирует

vc.dump(window=-1)
vc.findViewWithTextOrRaise(u'NORMAL').touch()
vc.sleep(_s)
vc.dump(window=-1)
vc.findViewWithTextOrRaise(u'SMALL').touch()
vc.sleep(_s)
vc.dump(window=-1)
vc.findViewWithTextOrRaise(u'OFF').touch()
vc.sleep(_s)
vc.dump(window=-1)

который вы можете затем вручную превратить в

for t in ['NORMAL', 'SMALL', 'OFF']:
    b = vc.findViewWithTextOrRaise(t)
    print >> sys.stderr, "clicking", b,  "@", b.getXY()
    b.touch()

или даже

for t in ['NORMAL', 'SMALL', 'OFF']:
    vc.findViewWithTextOrRaise(t).touch()

это предполагает, что экран не меняется, когда вы нажимаете кнопки, если это так, вам нужно снова вызвать vc.dump().

Затем вы можете скопировать и вставить в исходный сценарий.

person Diego Torres Milano    schedule 10.02.2017
comment
Я не могу установить подушку на python 2.7 stackoverflow.com/questions/42192775/ - person liv2hak; 12.02.2017