Appium 【解决】appium 使用 by_name(id)定位元素,结果为空

zws20041984 · 2013年12月25日 · 最后由 思寒_seveniruby 回复于 2013年12月26日 · 3263 次阅读

我在使用当当网的 APP 做练习,它的首页元素导航栏是一个 TabWidget 控件,id 为 tabs。里面有四个 ImageView。具体见下图

现在通过 driver.find_elements_by_name("tabs") 来取值,代码如下

import os
import time
from selenium import webdriver

# Returns abs path relative to this file and not cwd
PATH = lambda p: os.path.abspath(
    os.path.join(os.path.dirname(__file__), p)
)

desired_caps = {}
desired_caps['device'] = 'Android'
desired_caps['browserName'] = ''
desired_caps['version'] = '4.3'
desired_caps['app'] = PATH('d:/android/dd_android_client5.0.0-10-18.apk')
desired_caps['app-package'] = 'com.dangdang.buy2'
desired_caps['app-activity'] = '.StartupActivity'
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)

time.sleep(10)
imageviews = driver.find_elements_by_name("tabs")
print imageviews
imageviews[0].click()

driver.quit()

执行后输出结果为

appium 输出信息为:

共收到 24 条回复 时间 点赞

完整的输出贴一下, 还有 appium log 的输出

你应该用 tagName 找,去找 tabwidget, 然后在这个 tabwidget 对象中用 xpath 查找第几个你想点击的图标~~~或者直接用 xpath 找也可以,但是我发现 appium 直接这么找经常有问题

#1 楼 @seveniruby 已经修改,输出的 log 都加上了

#2 楼 @spikeshen 改为使用 tagname 还是不行

elem = driver.find_element_by_tag_name('TabWidget')
print elem
elem[0].click()

也是提示没找到

@zws20041984 ,你应该直接定位 image view,做 click 操作啊

#4 楼 @zws20041984 用法不对, 所以没找到. android 的 tabwidget 会被映射为 tab 标签.
使用//tab[1] 就可以了.

奇怪,今天再试的时候错误提示变成了

Traceback (most recent call last):
  File "D:\appiumtest.py", line 45, in <module>
    imageviews = driver.find_elements_by_name(tabs)
NameError: name 'tabs' is not defined
[Finished in 48.5s with exit code 1]

换成 by_tag_name 的 TabWidget 和 ImageView 也都不行
但换成 by_tag_name(image)就能行,就是找到的图片太多,下标不好确定

#6 楼 @seveniruby 可否再详细一些呢?tab[1] 是指在 byname 时就指定 [1] 还是取到 by_name(tabs) 后再区分呢?谢谢。

#8 楼 @zws20041984 详细的话, 还是看我们翻译好的 appium 中文文档吧, 你可以搜搜以前的帖子

#6 楼 @seveniruby 就是 tabwidget。。。。我昨天刚用过,driver.find_element_by_tag_name('tabwidget') 。 "table",映射的是 "TableLayout"

#10 楼 @spikeshen 是的, 是我看错了

map.put("tabhost", "TabHost");
map.put("tabwidget", "TabWidget");
map.put("table", "TableLayout");

#7 楼 @zws20041984 建议看下 xpath 相关的文章,有的时候只能用 xpath 来找

#13 楼 @spikeshen 是否是大部分最好用 xpath 来定位好一些,我看这个 APP 上全是图片或者文字,是 button 的很少。

#14 楼 @zws20041984 恩,你这个按位置找好点

#13 楼 @spikeshen 我觉得 xpath 比 id 和 name 还方便, 就算研发设置了 id, 使用 xpath 来描述 id 定位也很直接. 我现在基本上都在用 xpath 了. 在底层, 这三种方式会变成一个描述结构.
建议采用 page object 方式去搞, 尽量屏蔽定位细节.

#16 楼 @seveniruby 我也喜欢 xpath,用 selenium 的时候一般都用 xpath 来找。不过目前 appium 支持还是有好多问题=。= 没法找父类啥的,而且有些属性里包含特殊字符也会导致报错。

#17 楼 @spikeshen appium1.0 就会有完整的 xpath 支持, 到时候问题就没了. 找父类这种事情, 应该从 root 上找.

#16 楼 @seveniruby @spikeshen 现在是 screen object

#19 楼 @lihuazhang 哦? 方便的话贴个实例代码上来,我看看怎么用,多谢哈

#19 楼 @lihuazhang 我也不了解, 有个介绍吗, 这个概念还不知道从什么地方起的.

#18 楼 @seveniruby 已经能够获取到指定元素了,但是却无法复制,不光是使用 Inspector,自己写 java 的代码也无法复制,你个人觉得这是自己 app 的问题还是 appium 的 bug?该如何解决呢?

这个问题有解决吗,我定位 tag_name 也是没结果

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