Всем привет, мы снова встретились, я ваш друг Цюаньчжаньцзюнь.
Несколько примеров добавления параметров устройства
#Метод 1: добавьте устройства в интерфейсе auto_setup()
auto_setup(__file__,devices=["Android://127.0.0.1:5037/SJE5T17B17"])#Метод 2: используйте метод Connect_device() для подключения к устройству
dev = Connect_device("Android://127.0.0.1:5037/SJE5T17B17")#Метод 3: используйте метод init_device() для подключения к устройству
init_device(platform=”Android”,uuid=”SJE5T17B17″)
Фильтровать несерьезные журналы
__author__ = “Airtest”
importlogging
logger= logging.getLogger(“airtest”)
logger.setLevel(logging.ERROR)
Перебрать коллекцию элементов списка
for item in range(len(freeze_poco(“List”).child())):
item=str(item)poco(“NestStarReward”).offspring(item).offspring(“T”).click()
Заморозьте poco, чтобы ускорить операции
Freeze_poco = poco.freeze() #TODO: определениеdongjiepocofreeze_poco("TheExpDlg(Clone)").offspring(item).click()
Нажмите, если элемент не существует
if not poco(“TeamDlg(Clone)”).offspring(“Categories”).offspring(“item1”).offspring(“Text”).exists():
poco(“CurrentCategory”).click()
Нажмите, если элемент существует
if poco(“TeamDlg(Clone)”).offspring(“Categories”).offspring(“item1”).offspring(“Text”).exists():
poco(“CurrentCategory”).click()
Сброс окружения следующего дела в скрипте
try:finally:
Определите, существует ли одновременно несколько элементов управления
with poco.freeze() as freeze_poco:if freeze_poco(“DetailsBtn”).exists() and\
freeze_poco(“CurrentExp”).exists() and\
freeze_poco(“Chests”).child(“item0”).exists() and\
freeze_poco(“Chests”).child(“item1”).exists() and\
freeze_poco(“Chests”).child(“item2”).exists() and\
freeze_poco(“Chests”).child(“item3”).exists() and\
freeze_poco(“Chests”).child(“item4”).exists() and\
freeze_poco(“LeftView”).child(“Exp”).exists() and\
freeze_poco(“LeftView”).child(“Exp500”).exists() and\
freeze_poco(“LeftView”).child(“Exp1000”).exists() and\
freeze_poco(“LeftView”).child(“Exp500”).child(“box”).exists() and\
freeze_poco(“LeftView”).child(“Exp1000”).child(“box”).exists() and\
freeze_poco(“DailyActivityDlg(Clone)”).offspring(“RightView”).offspring(“Go”).exists()
Убедитесь, что элемент управления находится в пределах метода кликабельного диапазона.
def Butpos(butpos,pos1=0.4,pos2=0.81,high=1330,low=930,lows=482):"""Переместить элементы управления, которые не находятся внутри экрана, на экран, чтобы ими можно было управлять.
:param Butpos: элемент управления
:param pos1: Минимальный предел экрана, на котором вы хотите разместить элемент управления.
:param pos2: Верхняя граница экрана, на которой должен располагаться элемент управления.
:param high: фиксированные координаты
:param low: скользящее начальное или конечное положение
:param lows: скользящее начальное или конечное положение
:return:”””
for i in range(50):
but=butpos.get_position()if but[1]
swipe([high, lows], [high, low],5)elif but[1] >pos2:
swipe([high, low], [high, lows],5)else:break
Получить размер экрана телефона
def_get_screen_size(devices):’Получить размер экрана телефона’size_str= os.popen(f’adb -s {devices} shell wm size’).read()if notsize_str:print('Пожалуйста, установите ADB И погонять и настраивать переменные окружения’)
sys.exit()
m= re.search(r'(\d+)x(\d+)’, size_str)ifm:
sizeheight= “{height}”.format(height=m.group(1))
sizewidth= “{width}”.format(width=m.group(2))returnint(sizeheight),int(sizewidth)return “1920×1080”
Вывод печати в журнал
_print = print
def print(*args, **kwargs):
_print(time.strftime(“%Y-%m-%d %H:%M:%S”, time.localtime()), *args, **kwargs)
Определите pcoo с помощью функций
defdeviceconnect(devices):"""Открытый метод для создания экземпляра poco
:param devices: Укажите устройство
:return:”””dev= connect_device(“android:///” +devices)
poco= UnityPoco(device=dev)return poco
Все операции, связанные с пользовательским интерфейсом, по умолчанию используют точку привязки пользовательского интерфейса в качестве рабочей точки. Если вы хотите настроить точку, вы можете использовать метод фокуса. Вызов этого метода вернет новый пользовательский интерфейс с набором фокусов по умолчанию, а повторные вызовы будут основаны на последнем вызове. Фокус использует локальную систему координат, поэтому верхний левый угол ограничивающей рамки пользовательского интерфейса является началом координат, ось X находится вправо, ось Y — вниз, а длина и ширина ограничивающей рамки равны единице. Очевидно, что центральной точкой является [0,5, 0,5]. Следующие примеры покажут некоторые общие примеры использования.
poco(‘bg_mission’).focus(‘center’).click() #click the center
Сочетание focus и drag_to также может создать эффект прокрутки. В следующем примере показано, как прокрутить список на полстраницы.
scrollView = poco(type=’ScollView’)
scrollView.focus([0.5, 0.8]).drag_to(scrollView.focus([0.5, 0.2]))
Подождите, пока пользовательский интерфейс появится в течение заданного времени, и вернитесь к этому пользовательскому интерфейсу. Если он уже существует на экране, вернитесь непосредственно к этому пользовательскому интерфейсу. Если он не появился по истечении таймаута, он также вернется, но при вызове этой операции пользовательского интерфейса будет сообщено об ошибке. Подобные операции включают wait_for_appearance.
poco(‘bg_mission’).wait(5).click() #wait 5 seconds at most,click once the object appears
poco(‘bg_mission’).wait(5).exists() #wait 5 seconds at most,return Exists or Not Exists
щелкнуть
poco.click([0.5, 0.5]) #click the center of screen
poco.long_click([0.5, 0.5], duration=3)
проведите пальцем по экрану
#swipe from A to B
point_a = [0.1, 0.1]
center= [0.5, 0.5]
poco.swipe(point_a, center)#swipe from A by given direction
direction = [0.1, 0]
poco.swipe(point_a, direction=direction)
Сделайте снимок экрана и верните его в кодировке base64. Формат скриншота (png, jpg,...) определяется соответствующей реализацией SDK, в большинстве случаев это png. Подробности см. в ScreenInterface.getScreen.
from base64 importb64decode
# Примечание. Снимки не поддерживаются в некоторых реализациях Poco.
b64img, fmt= poco.snapshot(width=720)
open(‘screen.{}’.format(fmt), ‘wb’).write(b64decode(b64img))
Исключения
PocoTargetTimeout (тайм-аут управления)
from poco.exceptions importPocoTargetTimeouttry:
poco(‘guide_panel’, type=’ImageView’).wait_for_appearance()exceptPocoTargetTimeout:#bugs here as the panel not shown
raise
PocoNoSuchNodeException (нет такого контроля)
from poco.exceptions importPocoNoSuchNodeException
img= poco(‘guide_panel’, type=’ImageView’)try:if notimg.exists():
img.click()exceptPocoNoSuchNodeException:#If attempt to operate inexistent nodes, an exception will be thrown
pass
Самая простая операция – этощелкнуть,Вы также можете нажать и удерживать(long щелкните), вы можете нажимать ее столько, сколько захотите. В следующем примере показаны эффекты щелчка и длительного нажатия.
#coding=utf-8
from poco.drivers.unity3d importUnityPoco
poco=UnityPoco()
poco(‘btn_start’).click()
poco(‘basic’).click()
poco(‘star_single’).long_click()
poco(‘star_single’).long_click(duration=5)
Если вы читаете значение свойства из несуществующего пользовательского интерфейса или используете его, будет вызвано исключение. Если вы не уверены, существует ли пользовательский интерфейс, вы можете вызвать его. .exists() судить。в конкретномтеств случае использования,Если появляется аномальное сообщение, потому что пользовательский интерфейс не существует,Скорее всего это ошибка игры/приложения.,Не игнорируй это
#coding=utf-8
from poco.drivers.unity3d importUnityPoco
poco=UnityPoco()
btn= poco(‘btn_start’)
btn.click()print(btn.get_text()) #=> ‘Start’
intro= poco(‘introduction’)print(intro.get_text()) #=> ‘xxxx’
print(intro.attr(‘text’)) #=> ‘xxxx’
print(intro.attr(‘type’)) #=> ‘Text’
print(intro.attr(‘texture’)) #=> None. Because there is no texture on Text.
print(intro.attr(‘foo-bar’)) #=> None. Because “intro” dose not have an attribute named “foo-bar”.
intro.click()#Perform a click on any UI objects are allowed.
obj= poco(‘foo-bar’, type=’FooBar’)print(obj.exists()) #=> False. This UI does not exist actually
invisible_obj= poco(‘result_panel’, type=’Layer’)print(invisible_obj.exists()) #=> False. This UI is not visible to user.
Проведите пальцем по экрану
#coding=utf-8
from poco.drivers.unity3d importUnityPoco
poco=UnityPoco()#swipe the list view up
poco(‘Scroll View’).swipe([0, -0.1])
poco(‘Scroll View’).swipe(‘up’) #the same as above, also have down/left/right
poco(‘Scroll View’).swipe(‘down’)#perform swipe without UI selected
x, y = poco(‘Scroll View’).get_position()
end= [x, y – 0.1]
dir= [0, -0.1]
poco.swipe([x, y], end)#drag from point A to point B
poco.swipe([x, y], direction=dir) #drag from point A toward given direction and length
При автоматизированном тестировании пользовательского интерфейса наиболее важным моментом является выбор целевого пользовательского интерфейса. В обычных обстоятельствах выбор по имени является самым простым способом, но в некоторых случаях не каждый элемент управления пользовательского интерфейса имеет имя, особенно пользовательский интерфейс, который динамически создается и загружается с помощью кода, обычно не имеет значимого имени. Poco предоставляет мощные и эффективные методы выбора. Вы можете не только выбрать один атрибут пользовательского интерфейса, но также выбрать целевой пользовательский интерфейс с помощью иерархических отношений и позиционных отношений между пользовательскими интерфейсами. Что еще более важно, так это то, что три вышеупомянутых режима можно использовать в любой серии или комбинации, что позволяет справиться со всеми ситуациями.
В следующем примере показано, как выбрать соответствующий элемент управления пользовательского интерфейса в сложной иерархии.
#coding=utf-8
from poco.drivers.unity3d importUnityPoco
poco=UnityPoco()
items= poco(‘main_node’).child(‘list_item’).offspring(‘name’):
first_one=items[0]print(first_one.get_text()) #=> «1/2 зелья жизненной силы»
first_one.click(
Диапазон значений координат в poco зависит от экрана. Ширина и высота экрана равны единице, поэтому их также называют процентными координатами. Когда вам нужно взаимодействовать с элементами управления пользовательского интерфейса рядом с определенным элементом управления пользовательского интерфейса или нажать на край кнопки, а не на середину, вы можете использовать локальное позиционирование.
В общем, взаимодействие с элементами управления пользовательского интерфейса в конечном итоге предполагает взаимодействие с координатами. Например, нажатие кнопки фактически означает нажатие определенной координаты. Локальное позиционирование может быть смещено в зависимости от верхнего левого угла определенного пользовательского интерфейса, а затем вы можете щелкнуть различные координаты внутри элемента управления пользовательского интерфейса или даже другие координаты за пределами пользовательского интерфейса.
#coding=utf-8
importtimefrom poco.drivers.unity3d importUnityPoco
poco=UnityPoco()
image= poco(‘fish’).child(type=’Image’)
image.focus(‘center’).long_click()
time.sleep(0.2)
image.focus([0.1, 0.1]).long_click()
time.sleep(0.2)
image.focus([0.9, 0.9]).long_click()
time.sleep(0.2)
image.focus([0.5, 0.9]).long_click()
time.sleep(0.2)
Вы также можете щелкнуть за пределами выбранного пользовательского интерфейса. Полезно нажать на какую-нибудь модель по ее названию.
#coding=utf-8
from poco.drivers.unity3d importUnityPoco
poco=UnityPoco()
balloonfish_image= poco(text=’balloonfish’).focus([0.5, -3])
balloonfish_image.long_click()
В следующем примере показано, что фокус — это неизменяемый метод, который не влияет на исходный пользовательский интерфейс.
#coding=utf-8
from poco.drivers.unity3d importUnityPoco
poco=UnityPoco()#focus is immutable
fish = poco(‘fish’).child(type=’Image’)
fish_right_edge= fish.focus([1, 0.5])
fish.long_click()#still click the center
time.sleep(0.2)
fish_right_edge.long_click()#will click the right edge
time.sleep(0.2)
В следующем примере показано, как использовать перетаскивание для прокрутки списка.
#coding=utf-8
importtimefrom poco.drivers.unity3d importUnityPoco
poco=UnityPoco()
listView= poco(‘Scroll View’)
listView.focus([0.5, 0.8]).drag_to(listView.focus([0.5, 0.2]))
time.sleep(1)
Poco предоставляет очень простой способ обработки серии взаимодействий пользовательского интерфейса: просто используйте цикл for для итерации. В цикле for объектом каждой итерации является прокси-сервер пользовательского интерфейса, поэтому вы можете получить доступ к свойствам объекта и выполнять операции с объектом, как упоминалось ранее.
В примере ниже показано, как перебирать перетаскивание.
#coding=utf-8
importtimefrom poco.drivers.unity3d importUnityPoco
poco=UnityPoco()
poco(‘btn_start’).click()
poco(text=’drag drop’).click()
time.sleep(1.5)
shell= poco(‘shell’).focus(‘center’)for star in poco(‘star’):
star.drag_to(shell)
time.sleep(1)assert poco('scoreVal').get_text() == «100», «оценка верна #Это еще один метод утверждения».
poco(‘btn_back’, type=’Button’).click()
Вот еще один пример перебора всех названий модели.
#coding=utf-8
importtimefrom poco.drivers.unity3d importUnityPoco
poco=UnityPoco()for name in poco(‘plays’).offspring(‘fish’).child(‘name’):print(name.get_text()) #pearl/shark/balloonfish
В следующем примере показано, как приобрести все продукты на текущем экране интерфейса торгового центра.
#coding=utf-8
poco=Poco(…)
bought_items=set()for item in poco(‘main_node’).child(‘list_item’).offspring(‘name’):#get its text value
item_name =item.get_text()#markdown the bought item
if item_name not inbought_items:
item.click()
bought_items.add(item_name)
Это исключение конкретно относится к недопустимым операциям или операциям, которые не работают, например, щелчку за пределами экрана или установке атрибута текста на изображении (атрибут текста можно установить только в полях ввода). Хотя это исключение не окажет существенного влияния на приложение, его следует избегать, насколько это возможно, во избежание путаницы в логике тестового сценария или нестабильных результатов тестирования.
#coding=utf-8
from poco.drivers.unity3d importUnityPocofrom poco.exceptions importInvalidOperationException
poco=UnityPoco()try:
poco.click([1.1, 1.1]) #click outside screen
exceptInvalidOperationException:print(‘oops’)
Это исключение возникает, если вы читаете свойства или управляете несуществующим элементом управления пользовательского интерфейса. Чтобы проверить, существует ли элемент управления пользовательского интерфейса, можно вызвать метод .exists() делегата пользовательского интерфейса.
#coding=utf-8
from poco.drivers.unity3d importUnityPocofrom poco.exceptions importPocoNoSuchNodeException
poco=UnityPoco()
node= poco('не существующий узел') #select никогда не выдаст никаких исключений
try:
node.click()exceptPocoNoSuchNodeException:print(‘oops!’)try:
node.attr(‘text’)exceptPocoNoSuchNodeException:print(‘oops!’)print(node.exists()) #=> Фальшивый. Этот метод не повышает
Это исключение будет создано только тогда, когда вы активно ожидаете появления или исчезновения пользовательского интерфейса. Оно отличается от PocoNoSuchNodeException. Когда ваша скорость работы слишком высока и у интерфейса нет времени на изменение, вы столкнетесь только с PocoNoSuchNodeException вместо PocoTargetTimeout. Фактически, именно в этом пользовательском интерфейсе хочется что-то сделать еще до того, как он появится.
В следующем примере показано, как тестовый сценарий поддерживает синхронизацию с пользовательским интерфейсом и обрабатывает исключения PocoTargetTimeout.
#coding=utf-8
from poco.drivers.unity3d importUnityPocofrom airtest.core.api importconnect_devicefrom poco.exceptions importPocoTargetTimeout
poco=UnityPoco()#UI is very slow
poco(‘btn_start’).click()
star= poco(‘star’)try:
star.wait_for_appearance(timeout=3) #wait until appearance within 3s
exceptPocoTargetTimeout:print(‘oops!’)
time.sleep(1)
В отличие от PocoTargetTimeout, описанного выше, если скорость работы намного медленнее, чем скорость изменений пользовательского интерфейса, это исключение *вероятно* произойдет. Это исключение возникает только при доступе или работе с элементом управления пользовательского интерфейса, который был там только что, но больше не существует и обычно не отображается.
В следующем примере показан эффект щелчка элемента управления пользовательского интерфейса, который больше не существует.
#coding=utf-8
from poco.exceptions importPocoTargetRemovedException, PocoNoSuchNodeException
# Это исключение возникает только в некоторых реализациях poco-sdk, поэтому более надежным подходом является явный вызов .exists(), когда необходимо определить, существует ли пользовательский интерфейс.
poco=Poco(…)
start= poco(‘start’)print(start.exists()) #=> True.
start.click()print(start.exists()) #=> False
try:
start.click()exceptPocoTargetRemovedException:print(‘oops!’)#IMPORTANT NOTE:#`start2` is different from `start` !#`start` is tracking the UI at initial and it knows itself was removed but `start2`#does not know anything before.
start2 = poco(‘start’)try:
start2.click()exceptPocoNoSuchNodeException:print(‘oops!’)
Это исключение возникает только в некоторых реализациях poco-sdk, поэтому более надежным подходом является явный вызов .exists(), когда необходимо определить, существует ли пользовательский интерфейс.
на poco.drivers.std. StdPoco, это исключение никогда не возникало!
#coding=utf-8
from poco.drivers.unity3d importUnityPocofrom airtest.core.api importconnect_device
poco=UnityPoco()#no PocoTargetRemovedException case
start = poco(‘start’)print(start.exists()) #=> True.
start.click()print(start.exists()) #=> False
#ВАЖНО: В программном обеспечении Unity3d эта операция будет выполняться по тем же координатам, что и раньше #Что бы ни случилось
start.click()
В некоторых сложных тестовых случаях невозможно просто постоянно активно управлять или читать свойства. Пассивное получение событий изменения состояния пользовательского интерфейса помогает писать тестовые сценарии, которые не сбивают с толку. Poco предоставляет простой механизм опроса для одновременного опроса одного или нескольких элементов управления пользовательского интерфейса. Так называемый опрос предназначен для определения того, существует ли пользовательский интерфейс по очереди.
В следующем примере показана простейшая синхронизация пользовательского интерфейса.
#coding=utf-8
from poco.drivers.unity3d importUnityPoco
poco=UnityPoco()#start and waiting for switching scene
start_btn = poco(‘start’)
start_btn.click()
start_btn.wait_for_disappearance()#waiting for the scene ready then click
exit_btn = poco(‘exit’)
exit_btn.wait_for_appearance()
exit_btn.click()
В следующем примере показано, как ожидать опроса пользовательского интерфейса. Когда появится какой-либо пользовательский интерфейс, перейдите вниз.
#coding=utf-8
from poco.drivers.unity3d importUnityPocofrom poco.exceptions importPocoTargetTimeout
poco=UnityPoco()
bomb_count=0whileTrue:
blue_fish= poco(‘fish_emitter’).child(‘blue’)
yellow_fish= poco(‘fish_emitter’).child(‘yellow’)
bomb= poco(‘fish_emitter’).child(‘bomb’)
fish=poco.wait_for_any([blue_fish, Yellow_fish, бомба])if рыба-бомба:#Пропустить бомбу, досчитать до 3 и выйти
bomb_count += 1
if bomb_count > 3:return
else:# В противном случае нажмите на рыбу, чтобы ее собрать.
fish.click()
time.sleep(2.5)
В следующем примере показано, как дождаться появления всего пользовательского интерфейса перед отключением при опросе пользовательского интерфейса.
#coding=utf-8
importtimefrom poco.drivers.unity3d importUnityPoco
poco=UnityPoco()
poco(text=’wait UI 2′).click()
blue_fish= poco(‘fish_area’).child(‘blue’)
yellow_fish= poco(‘fish_area’).child(‘yellow’)
shark= poco(‘fish_area’).child(‘black’)
poco.wait_for_all([blue_fish, yellow_fish, shark])
poco(‘btn_back’).click()
time.sleep(2.5)
Представляем метод ускорения операций пользовательского интерфейса (то есть замораживания пользовательского интерфейса), который эффективен только для сложных выборов и обходов пользовательского интерфейса. Если вы просто выбираете по имени, не используйте этот метод, поскольку он не имеет никакого эффекта. На самом деле заморозка пользовательского интерфейса — это именно то, что иерархия текущего интерфейса, включая всю информацию об атрибутах пользовательского интерфейса, фиксируется и сохраняется в памяти. При взаимодействии с пользовательским интерфейсом атрибуты пользовательского интерфейса считываются непосредственно из памяти вместо отправки запросов RPC. в игру/приложение для управления пользовательским интерфейсом. Преимущество в том, что его можно получить один раз (затрачивая сотни миллисекунд) и можно использовать несколько раз. Чтение свойств пользовательского интерфейса практически не занимает времени. В то же время недостатком является то, что вам нужно вручную обрабатывать синхронизацию пользовательского интерфейса. определенный элемент управления пользовательского интерфейса изменяется после захвата иерархии. Произошло изменение. Если вы все еще нажимаете на этот пользовательский интерфейс в это время, вы щелкнете по исходной позиции, а не по последней позиции. Это может легко привести к странным результатам теста.
Следующие два примера показывают разницу между использованием замороженного и неиспользованием замороженного пользовательского интерфейса соответственно.
Freezing UI
importtimefrom poco.drivers.unity3d importUnityPoco
poco=UnityPoco()
with poco.freeze() as frozen_poco:
t0=time.time()for item in frozen_poco(‘Scroll View’).offspring(type=’Text’):printitem.get_text()
t1=time.time()print t1 – t0 #около 6 ~ 8 секунд
No Freezing UI
importtimefrom poco.drivers.unity3d importUnityPoco
poco=UnityPoco()
t0=time.time()for item in poco(‘Scroll View’).offspring(type=’Text’):printitem.get_text()
t1=time.time()print t1 – t0 #около 50 ~ 60 с
Заявление об авторских правах: Содержание этой статьи добровольно предоставлено пользователями Интернета, а мнения, выраженные в этой статье, представляют собой только точку зрения автора. Данный сайт лишь предоставляет услуги по хранению информации, не имеет никаких прав собственности и не несет соответствующей юридической ответственности. Если вы обнаружите на этом сайте какое-либо подозрительное нарушение авторских прав/незаконный контент, отправьте электронное письмо, чтобы сообщить. После проверки этот сайт будет немедленно удален.
Издатель: Лидер стека программистов полного стека, укажите источник для перепечатки: https://javaforall.cn/234846.html Исходная ссылка: https://javaforall.cn