Как автоматизировать выбор даты Android 6.0, чтобы установить любую дату?

Может ли кто-нибудь помочь мне автоматизировать DatePicker в Android 6.0 с помощью Appium и Java? Мне удалось автоматизировать это только для дат текущего месяца. Но мне нужно установить дату для любой даты, которую я передаю методу.

Как автоматизировать выбор даты Android 6.0, чтобы установить любую дату?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
0
1 329
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я наконец решил это. То, что я сделал, было из средства выбора даты, которое я взял текущий год и месяц. Исходя из этого, я вычислил количество нажатий для перехода вперед или количество нажатий для возврата к заданной дате. Вот фрагмент кода для этого.

public class Base {
    // Pass monthName param as "August"
    public int getMonthNumber(String monthName) throws ParseException {
        Date date = new SimpleDateFormat("MMMM").parse(monthName);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        System.out.println(calendar.get(Calendar.MONTH) + 1);
        return calendar.get(Calendar.MONTH) + 1;
    }

    // Pass date param as "Sun, Jul 1"
    public String getMonthNameInThreeChars(String date) {
        return date.substring(5, 8);
    }
}


public class CommonLocators extends Base {

public void setAndroidDatePicker(String date) throws IOException, ParseException {
        int thisYear = Integer.valueOf(androidDriver.findElement(By.id("android:id/date_picker_header_year")).getAttribute("name"));
        String today = androidDriver.findElement(By.id("android:id/date_picker_header_date")).getAttribute("name");
        int thisMonth = getMonthNumber(getMonthNameInThreeChars(today));

        // Split the given date into date, month and year
        String[] splitdate = date.split("\\s+");

        int givenDay = Integer.valueOf(splitdate[0]);
        int givenMonth = getMonthNumber(splitdate[1]);
        int givenYear = Integer.valueOf(splitdate[2]);

        int forwardTaps = 0;
        int backwardTaps = 0;
        int yearFactor = 0;

            if (givenYear == thisYear)
            {
                if (givenMonth >= thisMonth)
                {
                    forwardTaps = givenMonth - thisMonth;
                } else {
                    backwardTaps = thisMonth - givenMonth;
                }
            }
                else if (givenYear > thisYear)
                {
                    yearFactor = (givenYear - thisYear) * 12;
                        if (givenMonth >= thisMonth)
                        {
                            forwardTaps = yearFactor + (givenMonth - thisMonth);
                        } else {
                            forwardTaps = yearFactor - (thisMonth - givenMonth);
                        }
                }
                    else {
                        yearFactor = (thisYear - givenYear) * 12;
                            if (givenMonth >= thisMonth)
                            {
                                backwardTaps = yearFactor - (givenMonth - thisMonth);
                            } else {
                                backwardTaps = yearFactor + (thisMonth - givenMonth);
                            }
                    }


        for (int i=1; i<=forwardTaps; i++) {
            androidDriver.findElement(By.id("android:id/next")).click();
        }

        for (int i=1; i<=backwardTaps; i++) {
            androidDriver.findElement(By.id("android:id/prev")).click();
        }

        String xpath = "//android.view.View[@text='day']";
        androidDriver.findElement(By.xpath(xpath.replace("day", String.valueOf(givenDay)))).click();
        //Tap on OK button of the date picker
        androidDriver.findElement(By.id("android:id/button1")).click();

    }
}


public class CommonStepDefinitions {

    @Test
    public void setDate(String date) throws IOException, ParseException {
        commonLocators.setAndroidDatePicker(date);
    }
}

Эй, это решение работает. Но если я хочу выбрать дату 5 лет назад, тогда 5 * 12 = 60 раз выполнение действия click () на android: id / prev. Можем ли мы это оптимизировать? заранее спасибо

sandeepmaaram 24.06.2019 18:56

@sandeepmaaram Спасибо за отзыв. Да, мы можем это оптимизировать. Можете ли вы объяснить самый простой способ выбрать этот день из этого средства выбора даты? Я имею в виду последовательность действий. Тогда мы сможем оптимизировать код. Кстати, можете ли вы проголосовать за это, так как это будет полезно для других?

Osanda Deshan 25.06.2019 12:04

Процесс похож на: нажмите любую кнопку, появится средство выбора> щелкните год> появится список лет, прокрутите и выберите нужный год> затем выберите предыдущий / следующий месяц> выберите дату.

sandeepmaaram 01.07.2019 06:19

@sandeepmaaram Да, вы правы. Мы можем сделать это таким образом.

Osanda Deshan 02.07.2019 07:00

не могли бы вы поделиться информацией об androidDriver, который вы используете в своем коде? Это Аппиум?

Ramesh Natesan 10.05.2021 17:06

@RameshNatesan да, согласно вопросу, этот драйвер является драйвером appium

Osanda Deshan 11.05.2021 03:59

Используйте Android (Espresso only)

$driver.execute_script('mobile:setDate', { year: 2020, monthOfYear: 1, dayOfMonth: 25, element: $driver.find_element(:id, 'android:id/datePicker') })

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