问答 Appium 的 UIAutomator2 模式下使用 sendKeys 出现错误。

南十字 · 2019年01月16日 · 最后由 wangqiaodan 回复于 2020年05月16日 · 5467 次阅读

问题描述

使用 Appium 做 UI 自动化测试,因为要获取到 Toast 信息,就用了 UIAutomator2 模式。登录 App 后,有一个设置 6 个密码的步骤。如下图

上面有阴影的地方就是用来输入密码。布局如下图:

我一开始的做法是想直接获取到 “android.widget.LinearLayout” 然后输入 6 个数字的字符串。Appium 能定位到元素的位置,但使用 sendKey 时候报了如下的错误:
[JSONWP Proxy] Got an unexpected response: {"sessionId":"6098f2ff-17b6-4843-95d6-18b84cbccdfe","status":12,"value":"io.appium.uiautomator2.common.exceptions.InvalidElementStateException: Cannot set the element to '666666'. Did you interact with the correct element?\n\tat io.appium.uiautomator2.handler.SendKeysToElement.safeHandle(SendKeys...
[MJSONWP] Matched JSONWP error code 12 to InvalidElementStateError
[MJSONWP (c790c823)] Encountered internal error running command: InvalidElementStateError: io.appium.uiautomator2.common.exceptions.InvalidElementStateException: Cannot set the element to '666666'. Did you interact with the correct element?
[MJSONWP (c790c823)] at io.appium.uiautomator2.handler.SendKeysToElement.safeHandle(SendKeysToElement.java:96)
[MJSONWP (c790c823)] at io.appium.uiautomator2.handler.request.SafeRequestHandler.handle(SafeRequestHandler.java:37)
[MJSONWP (c790c823)] at io.appium.uiautomator2.server.AppiumServlet.handleRequest(AppiumServlet.java:250)
[MJSONWP (c790c823)] at io.appium.uiautomator2.server.AppiumServlet.handleHttpRequest(AppiumServlet.java:241)
[MJSONWP (c790c823)] at io.appium.uiautomator2.http.ServerHandler.channelRead(ServerHandler.java:44)
[MJSONWP (c790c823)] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:366)
[MJSONWP (c790c823)] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:352)
[MJSONWP (c790c823)] at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:345)
[MJSONWP (c790c823)] at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102)
[MJSONWP (c790c823)] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:366)
[MJSONWP (c790c823)] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:352)
[MJSONWP (c790c823)] at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:345)
[MJSONWP (c790c823)] at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:435)
[MJSONWP (c790c823)] at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:293)
[MJSONWP (c790c823)] at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:267)
[MJSONWP (c790c823)] at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:250)
[MJSONWP (c790c823)] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:366)
[MJSONWP (c790c823)] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:352)
[MJSONWP (c790c823)] at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:345)
[MJSONWP (c790c823)] at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1294)
[MJSONWP (c790c823)] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:366)
[MJSONWP (c790c823)] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:352)
[MJSONWP (c790c823)] at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:911)
[MJSONWP (c790c823)] at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:131)
[MJSONWP (c790c823)] at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:611)
[MJSONWP (c790c823)] at io.netty.channel.nio.NioEventLoop.processSelectedKeysPlain(NioEventLoop.java:514)
[MJSONWP (c790c823)] at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:468)
[MJSONWP (c790c823)] at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:438)
[MJSONWP (c790c823)] at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:140)
[MJSONWP (c790c823)] at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:144)
[MJSONWP (c790c823)] at java.lang.Thread.run(Thread.java:833)
[MJSONWP (c790c823)]
[MJSONWP (c790c823)] at errorFromMJSONWPStatusCode (C:\Users\m088163\AppData\Local\Programs\Appium\resources\app\node_modules\appium-base-driver\lib\protocol\errors.js:786:12)
[MJSONWP (c790c823)] at ProxyRequestError.getActualError (C:\Users\m088163\AppData\Local\Programs\Appium\resources\app\node_modules\appium-base-driver\lib\protocol\errors.js:683:14)
[MJSONWP (c790c823)] at JWProxy.command (C:\Users\m088163\AppData\Local\Programs\Appium\resources\app\node_modules\appium-base-driver\lib\jsonwp-proxy\proxy.js:234:19)

然后我尝试定位下一级的每一个控件,然后输入密码,但还是显示是同一个错误。

第一个方法中,在 Appium 默认的模式下,也就是 appium 是可以输入内容的。
请问有什么方法可以在 UIAutomator2 模式下向非 TextFiled 控件进行 sendKeys 操作?

项目环境

  • node.js version:v10.12.0
  • appium server version:v1.10.0
  • platform:Android
  • Android-Version:6.0

第一次发帖,如有格式不对的情况请海涵,谢谢!

共收到 11 条回复 时间 点赞

这种密码框一般就是不能直接 sentkey
你可以做 6 次 click

UIAutomator 模式能行的话 UIAutomator2 试试 set_value(element, value) ?

Bob 回复

我用的了键盘事件 ,

for(int i=1;i<=7;i++)
       driver.pressKeyCode(12);

但不知为何要执行 7 次,i<=6 就会没输完就点击下一步按钮,然后继续执行键盘事件?

appium 是什么版本的?

免费的自动化测试框架 Robotframework 介绍视频:https://ke.qq.com/course/380301?tuin=37feb0f

南十字 回复

在 presskeycode 这行后加 sleep(500) 试试?此时改成 i<7

大佬 问下最终问题咋解决的 目前正在面临同样的问题

pressKeyCode,我试了,可以的

keyevent() 、presskeycode() 都可以

输入内容是接口返回参数,不固定 这种的不能使用 keycode,大佬们都是咋解决的?

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