Appium 咨询帖,Appium Python 如何清空 EditText 内容

zhlog · 2015年09月07日 · 最后由 zhlog 回复于 2015年09月18日 · 2260 次阅读

我通过 id 定位到 EditText 元素后,使用 clear() 方法清空内容,再用 send_keys('str'),但在执行测试用例时,普通 EditText 内容是可以清空的正确输入内容,而密码 EditText 会把光标定位到文本第一位,追加输入 send_keys('str') 中的 str
新人初次发帖,描述可能不太清楚,还望各位热心朋友指教

共收到 12 条回复 时间 点赞

~Android吗?
可以将 send_keys() 方法封装一下...
加入driver.keyevent(123),这个方法会将光标移到最后,然后再执行 clear() 或 send_keys(),方法有很多,多多尝试。

最后请加个头像。

@anikikun
def edittextclear(self,text):
self.driver.keyevent(123)
for i in range(0,len(text)):
self.driver.keyevent(67)
你好,首先非常感谢你的回复。
我按照你说明的方法找到以上方法,然后通过下方的代码使用
passEdit = self.driver.find.......获取控件
passEdit.click()
pwdtext2 = passEdit.get_attribute('text')
self.edittextclear(pwdtext2)
passEdit.send_keys('POMI12')
但仍然出现帖子里描述的问题

Andoid 有 adb shell 命令输入文本的,可以尝试特殊输入替代 sendKeys():
上面清除后,在 CMD 窗口先手动输入 “adb shell input text "pwdtext2" ;如果可以你不妨封装一个 用这种方式封装一下

@happystone 你好,“pwdtext2"是我要清除掉的文本内容,input 不是输入么?
刚才我在 pwdtext2 = passEdit.get_attribute('text') 这行代码下面打印 pwdtext2 的 type 和 len,输出类型为 Unicode,长度为 0,我想问一下是通过 element.get_attribute('text') 获取编辑框的文本内容对吧?

get_attribute 是获取某个属性的值,这里获取的应该是编辑框中的文本内容。刚明白你的意思,我之前也碰到过类似情况,我在 sendkeys() 之前先做个 Click() 操作点击一下文本框,就解决了。sendkeys 在输入之前自己会先 Clear 一下,所以 Clear 其实也不用加

@happystone 按照你的方法试了也是不行,光标总会定位到文本前面

info: [debug] [BOOTSTRAP] [debug] Got command of type ACTION
info: [debug] [BOOTSTRAP] [debug] Got command action: setText
info: [debug] [BOOTSTRAP] [debug] Using element passed in.
info: [debug] [BOOTSTRAP] [debug] Attempting to clear using UiObject.clearText().
info: [debug] [BOOTSTRAP] [debug] Text remains after clearing, but it appears to be hint text.
info: [debug] [BOOTSTRAP] [debug] Text not cleared. Assuming remainder is hint text.
info: [debug] [BOOTSTRAP] [debug] Sending plain text to element: 15.........(纯数字)
info: [debug] [BOOTSTRAP] [debug] Returning result: {"value":true,"status":0}
以上是普通编辑框 clear() 后再 send_keys(‘15*********’) appium 端输出的信息,这个可以成功清除文本且正确输入指定的文本
info: [debug] [BOOTSTRAP] [debug] Got command of type ACTION
info: [debug] [BOOTSTRAP] [debug] Got command action: setText
info: [debug] [BOOTSTRAP] [debug] Using element passed in.
info: [debug] [BOOTSTRAP] [debug] Attempting to clear using UiObject.clearText().
info: [debug] [BOOTSTRAP] [debug] Sending plain text to element: ‘text_replace’
info: [debug] [BOOTSTRAP] [debug] Returning result: {"value":true,"status":0}
以上是密码编辑框 clear() 后再 send_keys(‘text_replace’) appium 端输出的信息,相比于普通编辑框输出的信息缺少了:
info: [debug] [BOOTSTRAP] [debug] Text remains after clearing, but it appears to be hint text.
info: [debug] [BOOTSTRAP] [debug] Text not cleared. Assuming remainder is hint text.
感觉出错应该是 hint text 的原因,但没能明白这个导致失败的原因也不知解决方法,还望指教
在此先感谢你能抽空回复我的疑问
补充一下调试设备信息 机型为红米 1 Android 版本为 4.4.2

Text remains after clearing, but it appears to be hint text. //文本清除后有残留,但是显示的是隐藏文本
Text not cleared. Assuming remainder is hint text. //文本未被清除,假定其确实为隐藏文本

  1. 根据 log 信息,两种文本框在点击后处理方式是不一样的,下面的缺少那两行,原因应该是 appium 检测到 “文本已经被清除了” 而不是向上面用隐藏的方式清除。我推测问题是出在你输入后,虽然发送了 sendKey(),但是文本框未检测到你有输入,所以当输入结束后,提示信息又被显示出来了。 2.两个文本在手动操作时,点击文本框后,弹出来的键盘是否是相同的?输入密码的键盘是否是开发人员自己开发的。如果是内部开发的键盘,就需要你去点击键盘去输入了,而不能用 sendKey() 命令。

根据你的第一条回复,表示稍微能理解你的意思,但希望能指导下出现的原因
根据你的第二条回复,第一个编辑框弹出的是数字键盘,第二个编辑框弹出的普通的 26 字母那种键盘,且键盘非内部开发键盘

具体原因你可以咨询一下开发,我也不是太清楚。
你有尝试过用 keyEvent() 去输入密码吗?实在不行就点击对应键盘的坐标输入。

@happystone keyEvent() 是可以的,但获取不了长度还是不太方便。
非常感谢你的热心回答

#10 楼 @pomi 还不行?
Try it..直接调这个方法清除试试。

def editClear(driver, el):
    el.click()
    driver.keyevent(123)
    textLength = len(str(el.text))
    for i in range(0, textLength):
        driver.keyevent(67)
zhlog #12 · 2015年09月18日 Author

@anikikun 不好意思现在在回帖,这个方法之前已经是不行的,现在因为工作原因暂时没时间去研究解决方法,之后有遇到类似问题再研究下

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