Appium: Change Android DatePicker value Javascript/NodeJS

Appium: Change Android DatePicker value Javascript/NodeJS

本文关键字:Javascript NodeJS value DatePicker Change Android Appium      更新时间:2023-09-26

我们正在尝试自动化测试的混合Android应用程序,但我们卡住了日期选择器。我们希望将日期选择器中的值更改为特定日期(6月-> 5月)。因此,我们检索了EditText元素并尝试更改文本。

我们基本上尝试了两种可能性:

  1. 直接使用sendKeys()设置文本;
  2. 首先选择所有文本然后设置文本

使用第一个选项appium告诉我们文本不能完全删除(使用appium 1.4.0, sendKeys应该清除编辑文本)。相反,前两个字符被删除,我们被字符"n"困住了。我们还尝试在数字选择器上设置文本(通过使用sendKeys())(更改android.widget.EditText -> android.widget.NumberPicker)。

driver.elementsByClassName("android.widget.EditText").then(function (promisses) {
    var promise = promisses[0];
    return promise.sendKeys('May').setImplicitWaitTimeout(3000);
});
对于第二个选项,我们尝试使用触摸操作(wd.TouchAction)长按输入字段并选择整个文本。然后我们使用sendKeys覆盖所选文本。这个选项的问题是使用长按不起作用。
driver.elementsByClassName("android.widget.EditText").then(function (elements) {
    var promise = elements[0];
    var action = new wd.TouchAction();
    action.press({el: promise}).wait(5000).release();
    return driver.performTouchAction(action);
});

driver.elementsByClassName("android.widget.EditText").then(function (elements) {
var promise = elements[0];
return driver.perform(new wd.TouchAction().longPress(promise));

});

我们也试过改变上下文。为了检索元素,我们需要NATIVE上下文,但为了确保这一点,我们也尝试了WEBVIEW上下文并在两者之间切换。

更改日期选择器文本分为3步:

  1. 长按(var action)选择文本
  2. 用键事件删除文本(deviceKeyEvent(67))
  3. 设置您想要的文本(setText(text)/sendKeys(text))

检索编辑文本元素是通过类名这是在android 'android.widget. edittext '完成的。为了检索元素,你也应该在Native上下文中。

也应该可以直接在数字选择器上执行,因为它的行为就像编辑文本一样。但我们没有尝试过。

var els;
return driver
       .elementsByClassName('android.widget.EditText')
       .then(function (_els) {
           els = _els;
           var el = els[0];
           return setDatePickerText(driver, el, month);
       })
       .then(function () {
           var el = els[1];
           return setDatePickerText(driver, el, year);
       });

function setDatePickerText(driver, el, text) {
  var pressDuration = 1000; 
  var action = (new wd.TouchAction()).press({el: el}).wait(pressDuration).release();
  return driver
       .performTouchAction(action)
       .deviceKeyEvent(67)
       .then(function () {
           return el;
       })
       .setText(text);
}