Как выбрать значение из раскрывающегося списка гибридного приложения с помощью appium?

Я относительно новичок в appium и активно участвую в poc. Требуется выбрать значение из раскрывающегося списка, однако я могу щелкнуть элемент счетчика, но все, что ниже, не распознается моим uiautomator. в результате я не могу выбрать какие-либо значения из элемента прядильщика. Я прикрепляю блок кода сценария, а также снимок дерева элементов.

 //trying to click the dropdown list
		 try{
			 WebElement parentElement1 = driver.findElement(By.id("retProdOp0"));
			 WebElement childElement1 = parentElement1.findElement(By
					.xpath("//android.view.View[@index='1']"));
			childElement1.click();
			driver.label("dropdown list 2nd element clicked");
		 }catch(Exception e){
			driver.label("Failed to click dropdown list on prodexchg screen");
			System.out.println(e.getMessage());
		 }
		 

Снимок1

Снимок2

Я хочу выбрать значения из раскрывающегося списка счетчика в Snapshot2. Однако я не могу найти их в uiautomator. Нужна помощь. Заранее спасибо.


person Sidd    schedule 10.04.2018    source источник


Ответы (4)


Вы используете неправильный локатор XPath для выбора элемента в раскрывающемся списке.

На вашем скриншоте uiautomator видно, что до того, как вы щелкнете раскрывающийся список, элементы в нем еще не находятся в DOM. Таким образом, поиск в родительском элементе неверен, так как в данный момент он не содержит элементов.

  1. Используйте appium-desktop вместо UIAutomator для проверки элементов, это работает лучше
  2. Щелкните раскрывающийся список, чтобы развернуть его
  3. Чтобы щелкнуть один из элементов, выполните следующие действия:

List<WebElement> items = driver.findElements(By.xpath("//android.view.View")); items.get(0).click();

or

driver.findElement(By.xpath("(//android.view.View)[1])

person dmle    schedule 11.04.2018
comment
Привет, dmle, попробовал то, что вы сказали, но также не смог найти элементы в appium-desktop. - person Sidd; 11.04.2018

Пробовал appium-desktop, но столкнулся с теми же проблемами. Скриншот 1 рабочего стола Appium Скриншот 2 для рабочего стола Appium

См. Второй снимок экрана. Спасибо

person Sidd    schedule 11.04.2018

Приведенное ниже решение поможет вам. Дай мне знать, если это не так.

  1. Из свойств вашего объекта кажется, что вы сейчас находитесь в нативном контексте. Поэтому перед тем, как выбрать раскрывающийся список, выберите «Веб-контекст».

driver.Context = "WebContext"; Or

driver.Context = "CHROMIUM";

Имя вашего веб-контекста может быть другим. 2. Теперь выберите элемент, как если бы вы делали это в сети, используя selenium webdriver.

Select dropdown = new Select(driver.findElement(By.id("mySelect"))); dropdown.selectByVisibleText("Text");

  1. Теперь вы можете вернуться к собственному контексту гибридного приложения, если хотите.

Примечание. Чтобы найти свойства веб-контекста, вы можете получить исходный код или перейти по URL-адресу в браузере.

person Community    schedule 03.08.2018

Если я правильно понимаю, у вас есть приложение с WebView, отображающим раскрывающийся список в HTML / JS.

Я загрузил https://www.w3schools.com/howto/howto_js_dropdown.asp как пример и сгенерировал тест, используя CulebraTester, нажав кнопку, а затем элемент «Ссылка 3».

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

Сгенерированный скрипт

#! /usr/bin/env python
# -*- coding: utf-8 -*-
'''
Copyright (C) 2013-2018  Diego Torres Milano
Created on 2018-04-11 by CulebraTester 
                      __    __    __    __
                     /  \  /  \  /  \  /  \ 
____________________/  __\/  __\/  __\/  __\_____________________________
___________________/  /__/  /__/  /__/  /________________________________
                   | / \   / \   / \   / \   \___
                   |/   \_/   \_/   \_/   \    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

import pkg_resources
pkg_resources.require('androidviewclient>=12.4.0')
from com.dtmilano.android.viewclient import ViewClient, CulebraTestCase
from com.dtmilano.android.uiautomator.uiautomatorhelper import UiAutomatorHelper, UiScrollable, UiObject, UiObject2

TAG = 'CULEBRA'


class CulebraTests(CulebraTestCase):

    @classmethod
    def setUpClass(cls):
        cls.kwargs1 = {'ignoreversioncheck': False, 'verbose': False, 'ignoresecuredevice': False}
        cls.kwargs2 = {'forceviewserveruse': False, 'useuiautomatorhelper': True, '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': 1, 'find-views-with-content-description': True, 'window': -1, 'orientation-locked': None, 'save-view-screenshots': None, 'find-views-by-id': True, 'log-actions': False, 'use-regexps': False, 'null-back-end': False, 'auto-regexps': None, 'do-not-verify-screen-dump': True, 'verbose-comments': False, 'gui': False, 'find-views-with-text': True, 'prepend-to-sys-path': False, 'install-apk': None, 'drop-shadow': False, 'output': None, '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

        UiScrollable(self.vc.uiAutomatorHelper, uiSelector='[email protected],index@0,parentIndex@0,[email protected]').getChildByText(uiSelector='text@Click Me', text="Click Me", allowScrollSearch=True).click()
        UiScrollable(self.vc.uiAutomatorHelper, uiSelector='[email protected],index@0,parentIndex@0,[email protected]').getChildByText(uiSelector='text@Link 3', text="Link 3", allowScrollSearch=True).click()


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

который, кажется, работает правильно.

Вы можете попробовать, если не можете найти другое решение с помощью appium.

person Diego Torres Milano    schedule 11.04.2018