Appium appium 简明教程 (11)——使用 resource id 定位

乙醇 · 2014年06月28日 · 最后由 fayer1986 回复于 2019年12月04日 · 3724 次阅读

上一节乙醇带大家了解了 appium 的定位策略。实际上 appium 的控件定位方式是完全遵守 webdriver 的 mobile 扩展协议的。

这一节将分享一下如何使用 resource id 来定位 android 策略。

什么是 resource id,这个不属于本文的范畴,大家可以点这里了解。

我们可以有两种方式来使用 resource id 进行定位:

  • 使用findElement(By.id("resourceId"))的方式。这也是原生的 webdriver 定义的方法,不过竟然在 appium 的官方文档里没有提及,属于隐藏技;

  • 使用find_elements_by_android_uiautomator('new UiSelector().resourceId("the_id")')的方式;关于 uiautomator 定位后面的教程会展开讲解;

从上面的代码片段可以看到,使用find_element_by_id的方式进行定位是最简便的。

那么怎么获取控件的 resource id 呢,使用 uiautomatorviewer 就可以了。具体方法如下图所示。
如何使用uiautomatorviewer

现在就以上图所示的 android 原生计算器程序为例,看一下每种语言是如何实现点击【9】这个按钮的。

目的

点击计算器上的【9】这个按钮。该按钮的 id 是com.android.calculator2:id/digit6 。先甜后苦,从 ruby 开始。
本文版权归乙醇所有,欢迎转载,但请注明作者与出处,严禁用于任何商业用途

Ruby 篇

require 'appium_lib'

caps   = { caps:       { platformName: 'Android', appActivity: '.Calculator', appPackage: 'com.android.calculator2' },
           appium_lib: { sauce_username: nil, sauce_access_key: nil, debug: true} }
dr = Appium::Driver.new(caps).start_driver

dr.find_element(id: 'com.android.calculator2:id/digit9').click

Python 篇

#coding:utf-8
from appium import webdriver
from time import sleep

desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '4.4'
desired_caps['deviceName'] = 'Android Emulator'
desired_caps['app'] = 'Calculator.apk'
desired_caps['appPackage'] = 'com.android.calculator2'
desired_caps['appActivity'] = '.Calculator'

dr = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
sleep(3)

dr.find_element_by_id('com.android.calculator2:id/digit9').click()

Java 篇

//新建一个FindById类位于info.itest.www package下面
package info.itest.www;

import io.appium.java_client.AppiumDriver;
import java.net.MalformedURLException;
import java.net.URL;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;

public class FindById {
    public static void main(String args[]) throws MalformedURLException {
        DesiredCapabilities cap = new DesiredCapabilities();
        cap.setCapability(CapabilityType.BROWSER_NAME, "");
        cap.setCapability("platformName", "Android");
        cap.setCapability("deviceName", "Android Emulator");
        cap.setCapability("platformVersion", "4.4");
        cap.setCapability("appPackage", "com.android.calculator2");
        cap.setCapability("appActivity", ".Calculator");

        AppiumDriver dr = new AppiumDriver(new URL("http://127.0.0.1:4723/wd/hub"), cap);

        dr.findElement(By.id("com.android.calculator2:id/digit9")).click();
    }
}

如果读者对 webdriver 很熟悉的话,那么掌握这个方法是非常简单的。如果对 webdriver 不熟悉,那么可以参考乙醇的 webdriver 实用指南,先学习一下 webdriver 的基础知识。

这一节我们写了一些脚本去进行控件定位,在实际的项目中,这些没有任何断言的脚本是基本上无法完成测试用例的功能的。

先卖个关子,下下一节乙醇将会带大家写第一个 appium 的测试用例。

那么下一节我们将学习如何使用 class name 进行定位。

本文版权归乙醇所有,欢迎转载,但请注明作者与出处,严禁用于任何商业用途

共收到 34 条回复 时间 点赞

动态图是亮点,更新至 11.

读完并已实践,谢谢乙醇分享。 gif 图 好形象的说。

学习啦。顶一个!

好东西,写的很亮

到时候整理一下,可以出书了, 哈哈

按照这样的写法,我报错了,麻烦帮忙看一下

#6 楼 @sean605 先测一下计算器,看看我给的代码是否可用,然后再看看你的 appium 版本。我的版本比较老。

#7 楼 @easonhan007 用你给的代码也不行,还是报错,我用的是 python 客户端 0.8

#7 楼 @easonhan007 我用的 windows 版的 appium1.1 启动 sever,然后在使用 python 写脚本,本地安装了 appium 的 python 库 0.8 版本的,运行就会出现找不到的问题,跟上面的我截图报错是一样的

#9 楼 @sean605 计算器的截图也发下,我和你环境一样,可以正常运行的。

#10 楼 @niweyzhuce
#7 楼 @easonhan007
很奇葩的问题,不知道为什么同样的代码在 Android 模拟器上可以跑,但是到真机上就会报错,说找不到那个控件

#11 楼 @sean605 模拟器在电脑上比较卡,我是在真机上测试的,系统 android 4.4

#12 楼 @niweyzhuce 我用的是 Genymotion,这个模拟器还可以

#12 楼 @niweyzhuce 知道是什么原因了,应该是因为手机 ROM 版本的问题,我把 ROM 更新到 4.4.2 就可以在真机上跑通了;

支持 Markdown 格式, 粗体删除线单行代码
支持表情,见 Emoji cheat sheet
按 “M” 键查看更多 帮助
注意单词拼写,以及中英文排版,参考此页

为什么我用 uiautomatorviewer 的时候,点击按钮 9 以后,看不到 resource id 这一项。

为什么我用 uiautomatorviewer 的时候,点击按钮 9 以后,看不到 resource id 这一项。

貌似需要安卓原生系统,我试过安卓原生系统的可以 华为 P6 不行

#6 楼 @sean605 求问,IDE 的名字……喜欢这个风格

#20 楼 @shixue33 jetbrain 的 pycharm

楼主没有后续文章?

用 4.3 手机是支持 resource-id 的, 4.3 以下的手机都不支持 resource-id

#18 楼 @cruiselijq 经过多个 android 手机试验发现,确认和 24 楼所说,需要 4.3 版本才有 resource-id 这一项。

尝试了三星 S4 4.2.2,三星 S3 4.3,红米 4.2.2,酷派 8812 4.2.2,只有三星 s3 4.3 的识别出来了 resource-id

#13 楼 @sean605 请问,我用 genymotion 时,app 日志中显示找到 1 device,0 emulator,trying to find。。。。

哎 一直找不到 id 我都郁闷两天了
最简单的启动加点击 你的计算器也试了 我这个是启动 qq 也不行

不加异常 就和上面那哥们一样报错 找不到啊

能够启动 qq 但是死活点不了 计算器也一样 总是找不到 id 还有别的方法么

找不到 应该不是加不加异常的原因吧,应该是你加了一个等待时间
以前在 web 端也遇到过类似问题,页面加载慢了,但是 python 代码不等你的,运行.py 时发现你还没加载好 就直接报错了

我在 UI Automator Viewer 里面获取了 resource id,但是运行时还是报错找不到该元素,为什么呢?我是真机测试
#! /usr/bin/env python
#coding=utf-8
import os
import time
import unittest
from selenium import webdriver
from lib2to3.pgen2.driver import Driver
from lib2to3.tests.support import driver

PATH=lambda p:os.path.abspath(os.path.join(os.path.dirname(file),p))
global driver

desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '4.2'
desired_caps['deviceName'] = 'Lenovo P1c72'
desired_caps['app'] = PATH('C:\Users\LENOVO\Desktop\StarZone_V2.0.0.apk')

driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

driver.find_element_by_id("com.xiangchao.starspace:id/skip").click()

报错:
selenium.common.exceptions.NoSuchElementException: Message: An element could not be located on the page using the given search parameters.

乙醇 [该话题已被删除] 中提及了此贴 08月26日 15:25

如果 resourceid 是一样的怎么办

#32 楼 @oceason 你找到了方法了吗

乙醇 Appium 简明教程 (持续更新) 中提及了此贴 12月01日 09:57

@zhopaa3721 你呢 找到方法了么

oceason 回复

就要用别的定位方法了吧

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