Appium 已解决:appium 查找了元素怎么不可以连续点击呀

付兰 · 2016年02月25日 · 最后由 Mr.Yang 回复于 2019年12月31日 · 3017 次阅读

小试了一下 appium,现在使用 find_element_by_name("xxx").click() 定位元素并且点击,当再次操作一次点击后没反应,如果是 find_element_by_id("xxx").click() 就可以,其他的暂没有试过,假如一定要用 find_element_by_name("xxx").click(),或者说定位的元素暂时只能通过 name 的方式,怎么实现连续点击啊。目前百度说加个延时时间,但是我加了 15s 的延时也没有。我是想实现计算器连续点击同一个数字的,假如只用 find_element_by_name("xxx").click() 怎么实现的,求解答,谢谢了!(PS:下面说一下不可以的原因)

#coding:utf-8
from appium import webdriver
import time
desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '0123456789ABCDEF'
desired_caps['appPackage'] = 'com.android.calculator2'
desired_caps['appActivity'] = '.Calculator'
dr = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
time.sleep(2)
dr.find_element_by_name("9").click()
dr.find_element_by_name("9").click()
dr.find_element_by_name("删除").click()
dr.quit()

上面代码只能输入一个 9

找到原因:如四楼说的一样,因为输入了一个 9,此时屏幕显示框内 9 的 name 值也是 9,所以导致计算器应用界面有两个 name 值都是 9,再次点击就不会成功了

共收到 20 条回复 时间 点赞

我也遇到过类似情况。我的原因是因为在点击后整体 UI 刷新导致控件布局发送变化导致。后来的解决方式是绕过这一步,通过获取控件属性得到控件的绝对坐标直接模拟点击坐标。算是一个临时的解决方案。坐等大神出来解答。

。。。加点等待时间

#2 楼 @neyo 加了 30s 了,还是不行

1、屏幕上有一个 “9”,在按钮上
2、点一下按钮 “9”
3、屏幕上有两个 “9”,一个在按钮上,另一个在输入结果上

猜的,未验证

PS:不要用 “小白”“大神” 之类的字眼

#4 楼 @sanlengjingvv 你的 PS,我现在修改,第一次发帖见谅,嘿嘿

#3 楼 @a3096556718 楼上有道理,你通过 id 定位吧

  1. 程序是否执行成功?如果没有执行成功,请贴出异常信息才好继续找问题
  2. 如果程序执行成功,看一下是否界面上已经输入的那个 “9” 也可以通过你的定位方式定位到。如果可以,可能是 tap 了一下输入了的那个 9,你看不到任何效果,正如 4 楼所说的那样
dr.find_element_by_name("9").click()
dr.find_element_by_name("9").click()
dr.find_element_by_name("删除").click()

改成

WebElement   nine = dr.find_element_by_name("9")
nice.click
time.sleep(5)
nice.click

上面没有验证过,不知道控件的类型在 python 中是不是叫 WebElement
java 的类似这么写是可以通过的

#8 楼 @darker50 nice?还是 nine。。

—— 来自 TesterHome 官方 安卓客户端

付兰 #10 · 2016年02月25日 Author

#9 楼 @huangke 他打错了

付兰 #10 · 2016年02月25日 Author

#8 楼 @darker50 你打错了,我改成你说的这样就可以了,谢谢哦

nine = dr.find_element_by_name("9")
nine.click()
time.sleep(5)
nine.click()

好奇怪,我记得昨晚也是这么做的,没出来,估计哪里写错了

#11 楼 @a3096556718 上次我也是两次定位,会出问题的,可能是 appium 的一个 bug 吧,后来就用上面的方法通过了,忘记 Python 不用变量声明了,哎,去补补。

我觉得 4 楼说的很有可能,find_element_by_name 并不是通过元素的 name 属性查找,而是遍历所有元素的所有属性的值吧。楼主能不能验证一下

#13 楼 @m13890 好的,我昨晚不知道他说的是什么意思,刚想回你这个的,结果仔细想了一下,他说的意思应该是第一次输入了 9,此时输入框内显示了 9,表示可能这个输入框内的 name 值也是 9,然后按键 9 的 name 值也是 9,你稍等,我试一下,嘿嘿

付兰 #15 · 2016年02月26日 Author

#8 楼 @darker50 错了,早上不行,四楼说的是对的,昨天按你的方法这么做之所以成功,因为我在前面输入了一个 1,所以才成功的,如果开始只输入一个 9,再次点击就不行,因为此时屏幕显示框内的 9 的 name 也是 9。原因就是四楼说的

付兰 #16 · 2016年02月26日 Author

#13 楼 @m13890
四楼说对了,昨晚按照 8 楼的说法去做之所以成功是因为我首先输入了一个 1,导致再次点击 9 时屏幕的值就是 19,所以再次输入 9 还是可以的

#4 楼 @sanlengjingvv 你猜对了

像这种用 id 定位就不会出现点不了的情况了

#16 楼 @a3096556718 综上所述还是用 id 或者用 xpath 来定位吧。

Appium 有现成的点击方案,(iOS 没有问题, Android 有问题)

def tap_el(self, element, times: int):
    """
    单击某个控件N次
    :param element: 要单击的控件
    :param times: 要单击的次数
    :return:
    """
    def _center_rect(r):
        # center_x = r['x'] + r['width'] / 2.0
        # center_y = r['y'] + r['height'] / 2.0
        center_x = r['width'] / 2.0
        center_y = r['height'] / 2.0
        return center_x, center_y

    rect = element.rect
    # HTNone 的设计缺陷导致不能准确的识别有效元素
    # 后期可能去掉HTNone
    if isinstance(rect, bool):
        return

    action = TouchAction(self)
    center = _center_rect(element.rect)
    action.tap(element=element,
               x=center[0],
               y=center[1],
               count=times).perform()
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册