如何用Appium和Java自动化Android 6.0 DatePicker设置任意日期?
实现Android 6.0 DatePicker任意日期自动化选择(Appium + Java)
我之前在做Android 6.0设备的自动化测试时,刚好遇到过和你一样的问题——只能选当月日期,没法跳转到任意日期。后来研究了原生DatePicker的控件结构,找到了可靠的解决方案,分享给你:
核心思路
Android 6.0的原生DatePicker是由三个NumberPicker控件组成的,分别对应「年」「月」「日」。我们只需要:
- 拆分传入的目标日期为年、月、日三个部分
- 分别定位到这三个NumberPicker
- 给每个Picker设置对应的值(注意月份是从0开始索引的,比如1月对应0,12月对应11)
- 点击确定按钮完成设置
代码实现
以下是完整的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
相关产品推荐
相关产品推荐

