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

Ionic 2自动化测试:如何用Appium+Webdriver.io设置DatePicker值?

解决Ionic 2 ion-datetime组件的Appium+Webdriver.io自动化测试问题

我来帮你搞定这个日期选择器的自动化测试难题!你遇到的问题根源在于Ionic的ion-datetime不是普通的可编辑输入框,它是一个封装好的自定义组件,点击后会唤起系统原生的日期选择器(iOS是UIDatePicker,Android是DatePickerDialog),所以直接用setValue操作这个组件元素肯定会报错——因为它本身就不是用户可直接编辑的文本输入框。

下面给你分平台和场景提供具体的解决方案:

核心思路

先点击ion-datetime组件唤起原生日期选择器,再针对不同平台的原生控件进行操作,最后点击完成按钮确认选择。

步骤1:唤起日期选择器

不管是iOS还是Android,第一步都是先点击组件弹出选择器:

// 等待组件加载完成,再点击
client.waitForExist('//*[@id="d.fromDt"]', 5000);
client.click('//*[@id="d.fromDt"]');

针对iOS平台的操作

iOS的原生日期选择器是XCUIElementTypePickerWheel类型的滚轮控件,我们可以直接定位每个滚轮并设置值:

// 等待原生选择器出现
client.waitForExist('XCUIElementTypePicker', 5000);

// 对应你的pickerFormat "MMM DD YYYY",三个滚轮分别是月份、日期、年份
client.setValue('XCUIElementTypePickerWheel[0]', 'May'); // 设置月份
client.setValue('XCUIElementTypePickerWheel[1]', '22'); // 设置日期
client.setValue('XCUIElementTypePickerWheel[2]', '2018'); // 设置年份

// 点击你定义的doneText按钮"ok"
client.click('~ok');

针对Android平台的操作

Android的日期选择器是原生对话框,推荐用Appium提供的mobile: setValue命令直接设置日期,比手动操作滚轮更高效:

// 等待原生日期选择器加载
client.waitForExist('android.widget.DatePicker', 5000);

// 获取日期选择器元素
const datePicker = client.element('android.widget.DatePicker');

// 使用mobile命令直接设置日期,格式为yyyy-MM-dd
client.execute('mobile: setValue', {
  elementId: datePicker.value.ELEMENT,
  value: '2018-05-22'
});

// 点击对话框的确定按钮(如果你的doneText是"ok",也可以用text定位:client.click('//*[@text="ok"]'))
client.click('android:id/button1');

如果上述命令不生效,也可以手动操作滚轮控件:

// 调整年份到2018
client.click('android.widget.NumberPicker[0]'); // 第一个滚轮是年份
client.sendKeys('2018');

// 调整月份到5月(注意Android月份是从0开始还是1开始,根据实际情况调整)
client.click('android.widget.NumberPicker[1]');
client.sendKeys('5');

// 调整日期到22号
client.click('android.widget.NumberPicker[2]');
client.sendKeys('22');

// 点击确定
client.click('android:id/button1');

进阶方案:直接修改Angular绑定值(不依赖原生控件)

如果你不想依赖系统原生选择器,也可以通过执行Angular内部代码直接修改ngModel绑定的fromDate值:

client.execute(() => {
  // 获取组件元素
  const dateElement = document.getElementById('d.fromDt');
  // 获取Ionic DateTime组件的Angular控制器实例
  const datetimeCtrl = angular.element(dateElement).controller('ionDatetime');
  // 设置日期值
  datetimeCtrl.fromDate = new Date('2018-05-22');
  // 触发Angular变更检测,更新视图
  datetimeCtrl.$apply();
});

⚠️ 注意:这种方法需要你的测试环境能访问Angular的全局变量,可能需要在Ionic应用中开启调试模式(比如禁用生产模式)。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:22:34