Appium appium 元素定位与交互中文文档

思寒_seveniruby · 2013年10月30日 · 最后由 xinxinga 回复于 2016年07月06日 · 8899 次阅读
本帖已被设为精华帖!

元素定位与交互

Appium 支持一个 Webdriver 元素定位方法的子集

  • find by "tag name" (i.e., 通过 UI 的控件类型)
  • find by "name" (i.e., 通过元素的文本, 标签, 或者开发同学添加的 id 标示, 比如 accessibilityIdentifier)
  • find by "xpath" (i.e., 具有一定约束的路径抽象标示, 基于 XPath 方式)

### 标签名抽象映射

你可以使用 UIAutomation 的控件类型用于标签名, 或者使用简化的映射, 可以参考下如下例子
https://github.com/appium/appium/blob/master/lib/uiauto/lib/mechanic.js#L29

(官方文档外的补充)
对于 Android 下的元素对应, 可以参考
https://github.com/appium/appium/blob/master/lib/devices/android/bootstrap/src/io/appium/android/bootstrap/AndroidElementClassMap.java

例子

找到屏幕上所有的 UIAButtons

WD.js:

driver.elementsByTagName('button', function(err, buttons) {
  // tap all the buttons
  var tapNextButton = function() {
    var button = buttons.shift();
    if (typeof button !== "undefined") {
      button.click(function(err) {
        tapNextButton();
      })
    } else {
      driver.quit();
    }
  }
  tapNextButton();
});

Ruby:

buttons = @driver.find_elements :tag_name, :button
buttons.each { |b| b.click }

Python:

[button.click() for button in driver.find_elements_by_tag_name('button')]

找到所有文本内容 (或者 accessibilityIdentifier) 为"Go"的元素

WD.js:

driver.elementByName('Go', function(err, el) {
  el.tap(function(err) {
    driver.quit();
  });
});

Ruby:

@driver.find_element(:name, 'Go').click

Python:

driver.find_element_by_name('Go').click()

找到以"Hi, "开头的导航条元素

WD.js:

driver.elementByXpath('//navigationBar/text[contains(@value, "Hi, ")]', function(err, el) {
  el.text(function(err, text) {
    console.log(text);
    driver.quit();
  });
});

Ruby:

@driver.find_element :xpath, '//navigationBar/text[contains(@value, "Hi, ")]'

通过 tagName 查找元素

Java:

driver.findElement(By.tagName("button")).sendKeys("Hi");

WebELement element = findElement(By.tagName("button"));
element.sendKeys("Hi");

List<WebElement> elems = findElements(By.tagName("button"));
elems.get(0).sendKeys("Hi");

Python:

driver.find_elements_by_tag_name('tableCell')[5].click()

FindAndAct

你也可以通过一行命令来完成元素的查找和交互 (只适用于 IOS)
举个例子, 你可以通过一次调用来实现查找一个元素并点击它, 使用的命令是mobile: findAndAct

Python:

args = {'strategy': 'tag_name', 'selector': 'button', 'action': 'tap'}
driver.execute_script("mobile: findAndAct", args)

用一个滑动手势进行下拉刷新

Python:

js_snippet = "mobile: swipe"
args = {'startX':0.5, 'startY':0.2, 'startX':0.5, 'startY':0.95, 'tapCount':1, 'duration':10}
driver.execute_script(js_snippet, args)

备注: driver.execute_script() 可以在 Automating Mobile Gestures: Alternative access method) 找到说明

使用 Appium Inspector 来定位元素

(翻译备注: 这个工具目前只有 Mac 版本, 如果你使用的是 windows, 可以使用 android 自带的 traceview 工具来获得元素的位置)

Appium 提供了一个灵活的工具 Appium Inspector, 允许你在 app 运行的时候, 直接定位你正在关注的元素. 通过 Appium Inspector(靠近 start test 按钮的 i 标示文本), 你可以通过点击预览窗口上的控件来获得它的 name 属性, 或者直接在 UI 导航窗口中定位

概述

Appium Inspector 有一个简单的布局, 全部由如下窗口组成.
UI 导航器, 预览, 录制与刷新按钮, 和交互工具

Step 1

例子

启动 Appium Inspector 后, (通过点击 app 右上的小"i"按钮), 你可以定位任何预览窗口中的元素. 作为测试, 我正在查找 id 为"show alert"的按钮

Step 1

要找到这个按钮的 id, 在定位预览窗口中我点击了"show alert"按钮, Appium Inspector 在 UI 导航窗口中高亮显示了这个元素, 然后展示了刚被点击按钮的 id 和元素类型

Step 1

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 35 条回复 时间 点赞

元素定位翻译完成
@monkey @lihuazhang

元素定位我用的很多, 下周的时候, 我再给官方提交一些测试用例吧,
他们的测试用例还是不够全.

对于一些地方, 比如

FindAndAct

官方文档这么写, 不知道是什么用意, 我没做翻译.

另外, 我们是否要在 doc 下新建 cn 了? 以后的文档都放到这个目录下?

#1 楼 @seveniruby 没有意义,页面也不显示,可能是占位用的。可以建立 cn 了吧。可以先陆续 pull request

#3 楼 @lihuazhang 你的意思是最后再创建 cn 对吧. 我感觉可以先创建, 然后把文档放进去.
我们先发起 pull request 给官方, 一部分发上去也行.
毕竟这是代码, 不是什么网站.

而且这样也可以提前验证官方的说法. 不然这中间再有其他人 pull request, 我们还得 merge 人家的, 就麻烦了.

#2 楼 @seveniruby 恩,先 pull request,对方今天回复,sounds great ,多期待~

#1 楼 @seveniruby 这个这样写总有意思的把,要不我去问问?

#6 楼 @monkey 算啦, 先这样就行了. 保证整体没问题.

@lihuazhang
本周大家审阅下各自的翻译, 然后创建 cn, 先搞一波 pull request 试试.

#7 楼 @seveniruby 好的。 我的意思是先创建 cn,开始 pull request 起来。。。

如何定位 iOS 文字编辑时,弹出的菜单上的不同选项?比如剪切 全选 复制这些文字...我用那个 inspector 倒是能查到所对应的 xpath...但程序执行的时候 就是找不到...求赐教!

add findAndAct method to get around ios ui invalidation issue

#9 楼 @bj_bug_hunter 最新的 appium 和 xcode 5.0.1 用不起来,没法帮你调试。。

#9 楼 @bj_bug_hunter 你可先打印下当前的 driver.page_source 看看, 当时的布局可能也分层的. 有的时候会有一层类似模式框的东西在最上层. 需要动态查找

android 有自带的元素定位工具吗?

#13 楼 @kevin_xu_v 参考 ppt 里面介绍的

#14 楼 @seveniruby traceview?有没有元素定位工具的 jar 包,traceview 是个带 UI 的工具,我需要拿到控件名和位置。

关于 hybrid app 的元素定位,appium 是怎么去做定位的?调用 selendroid?

uiautomation 也可以做 hybrid app 的测试?

#17 楼 @kevin_xu_v 是的, 都能做

#15 楼 @kevin_xu_v 可以考虑 viewserver 或者调用手机上的 uiautomator 也可以.

iOS 下, appium 怎么操作,可以跳过 app 首次启动的引导页? 试过 swipe 不行....

find_element_by_name(param),param 支持中文吗?
python 中,怎么使用正则匹配呢?

#22 楼 @mandy_hit 何不自己测试下?呵呵

Android 的 traceview 工具在哪?没找到……

第一个链接用不了了

怎么识别 webview 控件 UIAutomator 不识别

请问 Android 怎么获取元素的 tagname,通过 uiautomatorviewer 工具查看没这个属性

请问怎么在 ios 上点击屏幕呢 self.driver.execute_script("mobile: tap", {"touchCount":"1", "x":150, "y":300}) 为什么不行

python 中执行 wd.execute_script("mobile: swipe", {"touchCount": 1,"startX": 350, "startY": 325, "endX": 10, "endY": 325, "duration": 0.5 }) 总是报错:selenium.common.exceptions.WebDriverException: Message: Not yet implemented. Please help us: http://appium.io/get-involved.html 。 已经想尽各种办法,就是划屏不了。求助。


WebELement 这个需要自己创建类?还是可以直接使用,我这边直接使用 WebELement,报错

appium Inspector 希望支持 android 的元素定位,现在用其它工具,经常定位不到,很麻烦。。。。

#30 楼 @missz 你需要引入 selenium 的包 ,建议先去看看安装文档~

#30 楼 @sincool WebELement 写错了 改成 WebElement (l 小写)
整句应改为:WebElement element = driver.findElement(By.tagName("button"));

斯寒老大,问你个问题,find_element_by_accessibilty_id() 这个方法,ios 中意思为根据控件元素的 “accessbility identifier” 属性去寻找,然而 inspector 扫描控件却找不到这个属性,何解?比如用 sample code 里面的 app 去找,源代码中有这句 self.driver.find_element_by_accessibility_id('ComputeSumButton'),用 appium inspector 去扫描这个按钮,却没显示 accessbility identifier 属性。。

#34 楼@turinblueice, accessbility id 对应,name,label,value

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