Выберите элемент из AutoCompleteTextView в uiautomator

AutoCompleteTextView adapter issue for selecting item

Я создаю проект автоматизации, в котором у меня есть проблема, чтобы выбрать элемент из AutoCompleteTextView.

Вы можете видеть привязку и просмотры [все расширенные]. Выпадающее окно AutoCompleteTextView не отображается в дереве просмотров, и я не могу выбрать с помощью мыши.

Я попробовал подходы к выбору формы элемента из адаптера AutoCompleteTextView:

  • UiScrollable locationList = new UiScrollable(new UiSelector().scrollable(true)); locationList.scrollTextIntoView(location);

  • UiScrollable locationList = new UiScrollable(locationEditText.getSelector()); locationList.scrollTextIntoView(location); Здесь locationEditText - это мой AutoCompleteTextView

  • UiObject selectedLocation = locationList.getChild(new UiSelector().text(location)); selectedLocation.click(); из locationList не выбирает элемент с переданной строкой.

  • editLocationResId = "android:id/text1"; UiObject selectedLocation = new UiObject(new UiSelector().resourceId(editLocationResId)); selectedLocation.click(); Идентификатор из текстового представления адплера также не работает.

Может кто-нибудь помочь мне выбрать элемент из AutoCompleteTextView в uiautomator? Или больше подходит получить выход желания.

Ответ 1

попробуйте код ниже, он работал у меня.

Я использую AutoCompleteText для автоматического завершения местоположения, в котором находится пользователь, locationList - это не что иное, как массив, который я написал в файле strings.xml, поэтому здесь используйте свой собственный массив строк.

  locationList = res.getStringArray(R.array.ticketLocation);

        ArrayAdapter<String> locationAdapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, locationList);

        AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.txtCountries);
        textView.setThreshold(1);
        textView.setAdapter(locationAdapter);
        textView.setValidator(new Validator());
        textView.setOnFocusChangeListener(new FocusListener());

        textView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {
                // TODO Auto-generated method stub
                TextView ticketLocation = (TextView) view;
                getTicketLocation = ticketLocation.getText().toString();
            }
        });

и ниже - это код для проверки ввода текста в поле местоположения, метод fixText() запрещает пользователю вводить текст, который не существует в вашем строковом массиве, например: если пользовательский тип "germany" ", который не существует в списке строковых массивов, он будет заменен на" ", который является пустой строкой внутри поля ввода edittext

 class Validator implements AutoCompleteTextView.Validator {

        @Override
        public boolean isValid(CharSequence text) {
            // Log.v("Test", "Checking if valid: " + text);
            Arrays.sort(locationList);
            if (Arrays.binarySearch(locationList, text.toString()) > 0) {
                return true;
            }

            return false;
        }

        @Override
        public CharSequence fixText(CharSequence invalidText) {
            // Log.v("Test", "Returning fixed text");

            /*
             * I'm just returning an empty string here, so the field will be
             * blanked, but you could put any kind of action here, like popping
             * up a dialog?
             *
             * Whatever value you return here must be in the list of valid
             * words.
             */
            return "";
        }
    }

    class FocusListener implements View.OnFocusChangeListener {

        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            // Log.v("Test", "Focus changed");
            if (v.getId() == R.id.txtCountries && !hasFocus) {
                // Log.v("Test", "Performing validation");
                ((AutoCompleteTextView) v).performValidation();
            }
        }
    }

Ответ 2

Получить корни текстового поля:

int x = element.getLocation().getX();
int y = elmement.getLocation().getY();

Добавьте значения, чтобы получить правильные кордины.

x = x+x1
y = y+y1

Используйте функцию tap, чтобы щелкнуть по ней.

Действие TouchAction = новое TouchAction (драйвер);

action.tap(х, у).Выполните();

Ответ 3

сначала откройте подборщик, затем попробуйте использовать UiDevice.pressKey(), чтобы отправить событие DPAD_DOWN ИЛИ UP и нажмите Enter, чтобы выбрать нужный элемент.

Ответ 4

Если вам нужно нажать первый элемент из раскрывающегося списка, я нашел полезное обходное решение:

public void selectFirstElement() {
       TouchAction touchAction = new TouchAction(getAppiumDriver());
       int xTapped = autoCompleteTextView.getLocation().getX() +  autoCompleteTextView.getSize().getWidth() / 2;
       int yTapped = autoCompleteTextView.getLocation().getY() +  autoCompleteTextView.getSize().getHeight() ;
       touchAction.tap(xTapped, yTapped).perform(); }

Если AutoCompleteTextView объявлен как autoCompleteTextView, вы можете получить текущее местоположение на экране и рассчитать элемент, который будет расположен под ним. Надеюсь, поможет!