Appium appium for IOS 自定义数字键盘定位问题

王尼玛 · 2015年07月08日 · 最后由 momoko 回复于 2016年10月08日 · 1468 次阅读

各位好!

小弟遇到一个问题,求大家帮助。非常感谢。

如上图。
我想输入电话号码。

首先,我想到的是获取电话输入框的 xpath 来传值

driver.findElement(By.xpath(IOHelper.readValue("loc_ContacterPhone"))).sendKeys("13211110000");;

这种方式不行,会直接干掉 “电话” 文本,输入后并不能保存。

然后,我想到了通过 ClassName 来定位。

List<WebElement> list = getAllClassName(IOHelper.readValue("loc_NumberButton"));
        for(int a = 0; a<list.size(); a++){
            System.out.println("下标为:"+a+"内容为:"+list.get(a).getAttribute("name"));
        }

这种方式也不能定位。报错信息后面附上。

再然后,我通过数字键盘的 xpath 来定位

driver.findElement(By.xpath("//UIAApplication[1]/UIAWindow[2]/UIAButton[1]")).click();

这种方式也不行。报错信息都一样。后面附上。

最后,我点击坐标。

TouchAction action = new TouchAction(driver);
        action.press(5, 358);

还是不行。我就奔溃了。

爆粗信息都是一样。我就贴关键信息了。搞不懂了。求大家帮忙看看。

info: [debug] Got result from instruments: {"status":13,"value":"elementId 10 could not be tapped"}
info: [debug] Responding to client with error: {"status":13,"value":{"message":"An unknown server-side error occurred while processing the command.","origValue":"elementId 10 could not be tapped"},"sessionId":"199090ab-ab91-4401-8bea-68785738c1cf"}
info: <-- POST /wd/hub/session/199090ab-ab91-4401-8bea-68785738c1cf/element/10/click 500 1298.910 ms - 201 

可能是我没有找到根本的方法。像这种情况大家是怎么解决的?

共收到 6 条回复 时间 点赞

简单的解决办法:直接点击键盘上的 1,来挨个输入数字;
稍微复杂点的:用 copy 方法,粘贴在里面

#1 楼 @pighero001 谢谢。直接点击键盘上的 1,定位不了,我试了得。
你说的 copy 方法,能不能具体一点?谢谢

点坐标不应该有这个出错啊,因为你压根就没有 element 。另外,点坐标的写错了,应该是:

action.press(5, 358).perform();

否则就没有执行 press 了。


elementId 10 could not be tapped 我之前有遇到过,这个报错主要是 uiautomation 那边抛出来的,appium 只是把它封装了一次。

相关源码:

// Gesture functions
   tapById: function (elementId) {
     var element = this.getElement(elementId);
     var errObj = new ERROR.UnknownError(
       'elementId ' + elementId + ' could not be tapped');
     if (element !== null) {
       try {
         // element may still be null.
         element.tap();
       } catch (e) {
         if (e.message.indexOf("(null)") !== -1) {
           try {
             $.target().tap(element.rect());
           } catch (e2) {
             throw errObj;
           }
         } else {
           throw errObj;
         }
       }
     } else {
       throw new ERROR.UnknownError(
         'elementId ' + elementId + ' is null and can\'t be tapped.');
     }
   }

后来我的解决方案是自己封装了一个 tapByCoordinate 方法。大致思路:

  1. find element ,获取这个 element 的坐标(location)
  2. 检查坐标是否为有效值(我遇到过坐标值为类似 321321321e-32 的明显无效的值),如果带有 e- ,则重新再去 find
  3. 如果坐标为有效值,获取元素的 size ,然后点击坐标为:x: (location[0]+size[0])/2, y:(location[1]+size[1])/2(即元素的中央位置)

另外,你提到的

首先,我想到的是获取电话输入框的 xpath 来传值
这种方式不行,会直接干掉 “电话” 文本,输入后并不能保存。

干掉 “电话” 文本 是啥意思?没看懂。

#3 楼 @chenhengjie123
哥,谢谢你。我会根据你提供的信息想办法解决解决。
目前我已经用比较笨得方式解决了我的问题,绕了几个圈,输入 11 个数字要花好几分钟才行。效果不好。
干掉电话文本意思是,页面上本来有电话这个静态文字的,我输入后,就被我覆盖了。这个是因为我自己得错误导致的。

#4 楼 @wangnima 请问这个问题有比较好的解决方式啦么

#3 楼 @chenhengjie123 谢谢关于 “elementId 10 could not be tapped” 这个问题的解释和解决方案

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册