App客户端的页面时通过XML来实现UI布局的,页面的UI布局是一个树形结构,树叶被定义为节点。这里的节点也就对应了要定位的页面的元素,节点的上级节点是这个节点所在的布局结构。在XML布局中,我们可以使用XPath表达进行节点的定位。
1.App的页面布局结构
从图5-11中可以看到,最左侧的是App的页面,中间部分展示了这个页面的树形结构,及XML代码。
XML代码中包含的元素定位有关的内容如下。
(1)节点 node
(2)重要的节点属性:clickable(是否可点击)、content-desc(内容)、resource-id(元素 id)、text(文本)、bounds(坐标)。
2.App的页面元素定位的实现
(1)通过ID定位
Android系统的App的页面元素的ID称为resource-id,使用页面分析工具,如Appium Inspector,能够获取App的页面元素的唯一标识,即ID属性,使用ID属性进行页面元素的定位既方便又快捷。
示例代码如下(Python版和Java版)。
Python版本
driver.find_element(By.ID,"android:id/testl").click()
Java版本
driver.findElement(By.id("android:id/textl")).click();
注:resource-id对应的属性(包名:id/id值),我们在使用这个属性定位元素的时候要把它当做一个整体。
(2)通过accessibility-id定位
当用分析工具抓取到页面元素的content-desc的属性值是唯一时,可以采用accessibility-id定位页面元素,示例代码如下所示(Python版和Java版)。
Python版本
driver.find_element_by_accessibility_id("Accessibility")
Java版本
driver.findElementByAccessibilityId("Accessibility")
(3)通过XPath定位
我们也可以通过XPath 的方式完成页面元素的定位。XPath定位分为绝对路径定位与相对路径定位两种形式,下面介绍的都是XPath的相对路径定位形式。
1)XPath:resource-id属性定位
用resource-id定位页面元素怒的格式如下。
格式://*[@resource-id=’resource-id属性‘]
示例代码如下(Python版和Java版)
Python版本
driver.find_element(By.XPATH, \
'//*[@resource-id="rl_login_phone"]').click()
Java版本
driver.findElement(By.xpath(\
"//*[@resource-id="rl_login_phone"]"));
2)XPath:text属性定位
用text属性定位页面元素的格式如下。
格式:
//*[@text='text 属性']
示例代码如下(Python版和Java版)。
Python版本
driver.find_element(By.XPATH,'//*[test='我的']')
Java版本
driver.findElement(By.xpath("//*[@test="我的"]"));
3)XPath: class属性定位
通过class属性定位页面元素的格式如下。
格式:
//*[@class='class 属性']
示例代码如下(Python版和Java版)。
Python版本
driver.find_element(By.XPATH\
'//*[class="android.widget.EditTest"]')
Java版本
driver.findElement(By.xpath(\
"//*[class="android.widget.EditTest"]"));
4)XPath: content-desc属性定位
通过content-desc属性定位页面元素的格式如下。
格式:
//*[@content-desc='content-desc 属性']
示例代码如下(Python版和Java版)。
Python版本
driver.find_element(By.XPATH,\
'//*[@content-desc="搜索"]')
Java版本
driver.findElement(By.xpath(\
"//*[@content-desc="搜索"]"));
3.使用UI Automator Viewer定位
我们使用Android SDK(路径:sdk/tools/uiautomatorviewer)下自带的UI Automator Viewer工具也可以定位App的页面元素。
使用UI Automator Viewer之前,我们需要配置sdk/tools/路径到环境变量$PATH中,配置好路径后,直接在命令行直接输入下面的命令:
uiautomatorviewer
可以打开图5-12所示的一个页面,点击页面左上角的一个图标(手机图标),就可以获取UI Automator Viewer快照图。
用UI Automator Viewer抓取当前页面的截图,用以分析和展示当前页面上包含的所示有元素信息,如果想要查看XML DOM的具体结构代码,可以通过代码打印页面信息。通过代码 “driver.page_source” 打印手机页面信息,得到的内容如图5-13所示。图5-13中框起来的部分是XML DOM中的一个节点。
我们通过对图5-13的分析可以知道,android.widget.TextView是文本类型的节点,其中包含的属性信息都在UI Automator Viewer抓取快照(见图5-13)中展示。如果只想定位基于Android系统App的页面元素,可以直接使用UI Automator Viewer,运行速度快且不需要配置任何复杂的参数,直接在运行后的UI Automator Viewer界面上点击获取页面元素的图标就可以将客户端App的页面信息抓取出来。
另外,UI Automator Viewer只能抓取Android 8 以下版本的App的页面信息,如果要抓取Android 8 以上版本的App的页面信息,可以使用Appium Inspector。
搜索微信公众号:TestingStudio 霍格沃兹的干货都很硬核