appium简明教程(11)——使用resource id定位(仅支持安卓4.3以上系统)_qitehuanjue的博客-程序员宅基地

技术标签: Appium  

上一节乙醇带大家了解了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就可以了。具体方法如下图所示。

现在就以上图所示的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进行定位。

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qitehuanjue/article/details/53220983

智能推荐

听说最近你读过不少书 - java学习必读书单_chuixuan3775的博客-程序员宅基地

那些时光 噢,很久没有看过书了——此刻的你心里是否会发出这样的感慨? 我们总是怪工作太忙,总是怪应酬多、活动多;今天想着去哪玩,明天想着约妹纸……究竟什么时候会想着好好地静下心来翻一翻上面早已布满灰尘的书呢? 我理解,那部电视剧确实很精彩;我理解,那游戏确实很好玩。但是当某一天,你会...

TypeScript笔记(5)—— 基本数据类型_jcLee95的博客-程序员宅基地

TypeScript(5):基本数据类型1. let关键字JavaScript中使用关键字var来声明变量有很多的缺陷,首先一个就是var作用域的问题。比如:for (var i = 0; i < 5; i++) { console.log('for循环内,迭代变量i=' + i) }console.log('for循环外:,迭代变量i=' + i)可想而知,由于使用var声明的变量作用域比较宽松,在for语句等一些语句中,由var声明的变量可能受到外部的干扰而导

influxdb写入mysql_InfluxDB学习之InfluxDB的HTTP API写入操作_勉强解惑强行胡诌的博客-程序员宅基地

HTTP API也有两种操作:写入和查询,本文就先给大家介绍一下 InfluxDB的HTTP API的写入操作方式。在InfluxDB学习的上一篇文章:InfluxDB学习之InfluxDB的基本操作中,我们提到 InfluxDB操作有三种方式,其中一种是HTTP API的方式。HTTP API也有两种操作:写入和查询,本文就先给大家介绍一下 InfluxDB的HTTP API的写入操作方式。更...

E010Web学习笔记-Tomcat_訾博ZiBo的博客-程序员宅基地

一、web相关概念回顾1、软件架构C/S架构:客户端/服务器端;B/S架构:浏览器/服务端;浏览器内含静态资源解析引擎;浏览器请求数据,服务器响应来自浏览器的请求;2、资源分类静态资源:每个用户访问后得到的结果是一样的;直接返回给浏览器,浏览器内含静态资源解析引擎;如:html,css,js;动态资源:每个用户访问相同资源后得到的结果可...

winform窗体中嵌入网页(DHTML代码和winfrom应用程序交互)_wangchaoqi1985的博客-程序员宅基地_winform中嵌入html

本文转载自:https://www.cnblogs.com/charles2008/archive/2009/08/08/1541968.html 作者:Charles2008 转载请注明该声明。 在开发RFID项目中,看到同事在winform中加入网页。界面用Css和JavaScript做出来的效果很不错,比直接用winform做出来的效果好得多。更何况winform在页面表现上...

elastic5.6安装及配置_李思苇的博客-程序员宅基地

单节点elasticsearch.yml注意配置:bootstrap.memory_lock: true # disable swapping bootstrap.system_call_filter: falsejvm.options将xms与xmx设定为同样大小的值,以防止jvm的resize。/etc/security/limits.conf...

随便推点

了解如何升级和管理Amahi服务器存储_culunxun2863的博客-程序员宅基地

We have just shown you that you can upgrade your Windows Home Server for free by choosing the open source Amahi server. Now that it’s installed, here’s how to manage your drives, shares, and storage p...

UVA6692 Lucky Number【水题+序列】_海岛Blog的博客-程序员宅基地

Rock City traditionally holds an open-air non-reserved seat rock concert at the end of the summer. In the past, ticket holder would line up in a queue and enter the gate sequentially. Seating is on a ...

可以连接服务器无法发送邮件 诛仙,本地SMTP邮件服务器无法发送邮件(连接超时)..._JeSuisEtienne的博客-程序员宅基地

Feb 14 14:09:04 es1 postfix/smtp[16443]: connect to mx3.hotmail.com[65.54.188.94]:25: Connection timed outFeb 14 14:09:34 es1 postfix/smtp[16443]: connect to mx1.hotmail.com[104.44.194.231]:25: Connec...

Tomcat(一):背景知识和安装tomcat_weixin_33971130的博客-程序员宅基地

Tomcat系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html1. 基础背景知识1.1 java和jdk概念无论是何种程序,要能在计算机上运行,必须能转换为二进制的机器语言才能和硬件进行交互,在机器语言的上层是汇编语言,再上层是C/C++这样较底层的语言,由于它们严重依赖于平台架构,所有一般只能运行在程序源代码已编...

python算因数之和是_python找出因数与质因数的方法_weixin_39786341的博客-程序员宅基地

最近有一个学弟问我一些求解质因数的问题,帮他解决问题的同时自己也试着写了几个差不多效果的脚本,有很多不同的思路,以下是相关脚本。n = int(input("input number: ")) # 输入数字fac = [] # 定义一个列表存放因子for i in range(2, n): # 这里的逻辑和你一样if n % i == 0:fac.append(i) # 如果是因子就放进去cont...

linux命令vgdisplay提示权限不足,vgdisplay_程秧秧的博客-程序员宅基地

磁盘信息[[email protected] ~]# fdisk -lDisk /dev/hda: 41.1 GB, 41174138880 bytes255 heads, 63 sectors/track, 5005 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytesDevice Boot Start End Bl...