You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Appium和Java自动化Android 6.0 DatePicker设置任意日期?

实现Android 6.0 DatePicker任意日期自动化选择(Appium + Java)

我之前在做Android 6.0设备的自动化测试时,刚好遇到过和你一样的问题——只能选当月日期,没法跳转到任意日期。后来研究了原生DatePicker的控件结构,找到了可靠的解决方案,分享给你:

核心思路

Android 6.0的原生DatePicker是由三个NumberPicker控件组成的,分别对应「年」「月」「日」。我们只需要:

  1. 拆分传入的目标日期为年、月、日三个部分
  2. 分别定位到这三个NumberPicker
  3. 给每个Picker设置对应的值(注意月份是从0开始索引的,比如1月对应0,12月对应11)
  4. 点击确定按钮完成设置

代码实现

以下是完整的Java代码示例,假设你已经初始化好了AppiumDriver实例:

import org.openqa.selenium.By;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidElement;

public class DatePickerHandler {
    private AndroidDriver<AndroidElement> driver;
    private WebDriverWait wait;

    // 构造方法,传入已初始化的AppiumDriver
    public DatePickerHandler(AndroidDriver<AndroidElement> driver) {
        this.driver = driver;
        this.wait = new WebDriverWait(driver, 10); // 10秒等待超时
    }

    // 传入格式为"yyyy-MM-dd"的日期,完成DatePicker设置
    public void setCustomDate(String targetDate) throws Exception {
        // 1. 拆分日期为年、月、日
        String[] dateParts = targetDate.split("-");
        int targetYear = Integer.parseInt(dateParts[0]);
        int targetMonth = Integer.parseInt(dateParts[1]) - 1; // Android月份从0开始
        int targetDay = Integer.parseInt(dateParts[2]);

        // 2. 等待DatePicker加载完成,定位三个NumberPicker
        AndroidElement yearPicker = wait.until(ExpectedConditions.visibilityOfElementLocated(
                By.id("android:id/date_picker_year")));
        AndroidElement monthPicker = wait.until(ExpectedConditions.visibilityOfElementLocated(
                By.id("android:id/date_picker_month")));
        AndroidElement dayPicker = wait.until(ExpectedConditions.visibilityOfElementLocated(
                By.id("android:id/date_picker_day")));

        // 3. 设置每个Picker的值
        yearPicker.sendKeys(String.valueOf(targetYear));
        // 对于月份,也可以用文本定位(比如"May"),如果sendKeys不生效的话
        monthPicker.sendKeys(String.valueOf(targetMonth));
        dayPicker.sendKeys(String.valueOf(targetDay));

        // 4. 点击确定按钮
        AndroidElement confirmBtn = wait.until(ExpectedConditions.elementToBeClickable(
                By.id("android:id/button1")));
        confirmBtn.click();
    }
}

特殊情况处理

如果某些定制ROM的DatePicker不支持sendKeys直接设置值,可以改用滚动定位的方式(利用Appium对UiAutomator的支持):

比如设置月份的替代方案:

// 假设目标月份是"May"(英文系统),中文系统就传"五月"
String targetMonthText = "May";
// 定位月份滚轮并滚动到目标文本
AndroidElement monthPicker = driver.findElement(By.id("android:id/date_picker_month"));
driver.executeScript("mobile: scroll", ImmutableMap.of(
        "elementId", monthPicker.getId(),
        "toText", targetMonthText,
        "direction", "down"
));

注意事项

  • 确保传入的日期格式正确(yyyy-MM-dd),可以在方法开头加格式校验逻辑
  • 如果DatePicker是弹出式的,要先触发弹出操作再调用这个方法
  • 不同设备的系统语言可能影响月份文本显示,建议优先用数字索引(减1后的月份值)来设置,兼容性更好

内容的提问来源于stack exchange,提问作者Osanda Deshan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:06:32