【问题标题】:How to automate Android 6.0 Date picker to set any date?如何自动化 Android 6.0 日期选择器来设置任何日期?
【发布时间】:2018-09-03 15:06:49
【问题描述】:

谁能帮助我了解如何使用 Appium 和 Java 在 Android 6.0 中自动化 DatePicker?我只能在当前月份自动执行它。但我需要为传递给该方法的任何日期设置日期。

【问题讨论】:

    标签: java android automation appium


    【解决方案1】:

    我终于解决了这个问题。我所做的是从日期选择器中获取当前年份和月份。并且据此我计算了向前的点击次数或向后退到给定日期的点击次数。这是代码sn-p。

    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 次在 android:id/prev 上执行 click() 操作。我们可以优化这个吗?提前致谢
    • @sandeepmaaram 感谢您的反馈。是的,我们可以对此进行优化。你能解释一下从这个日期选择器中选择那一天的最简单方法吗?我的意思是动作顺序。然后我们可以优化代码。顺便说一句,您可以对此表示赞同吗,因为这对其他人有帮助?
    • 流程是这样的:点击任意按钮,选择器会出现>点击年份>年份列表会出现,滚动并选择所需年份>然后选择上/下个月>最后选择日期。
    • @sandeepmaaram 是的,你是对的。我们可以这样做。
    • 您能否分享有关您在代码中使用的 androidDriver 的信息?是 Appium 吗?
    【解决方案2】:

    你可以使用Android (Espresso only)

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

    【讨论】:

      猜你喜欢
      • 2015-07-31
      • 1970-01-01
      • 1970-01-01
      • 2017-09-19
      • 1970-01-01
      • 2014-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多