关于 appium get_attribute 方法的坑

(得要学着看源码)

问题:

self.driver.find_element_by_id("id").get_attribute("content-desc"), 会报NoSuchElement异常,经过验证是get_attribute的问题

问题原因探究:需要学会分析排插定位问题的根源,最关键还是要理解业务、底层代码、调用库实现流程的原理

appium server 在 android 原生应用上获取 attribute 的大致流程为:

  1. 从 client 收到获取 attribute 的请求
  2. 把请求转发给在手机上运行的 bootstrap
  3. bootstrap 调用相关方法进行实际操作
  4. bootstrap 返回结果给 appium server
  5. appium server 把结果返回给 client

通过排查各部分的代码发现,错误是在 bootstrap 产生的(排查过程涉及代码有点多,所以这里就不解释了),所以看看 bootstrap 相关源码:

其中`getStringAttribute`和`getBoolAttribute`源码如下:

总结:

1、获取 content-desc 的方法为 get_attribute("name") ,而且还不能保证返回的一定是 content-desc (content-desc 为空时会返回 text 属性值)
2、get_attribute 方法不是我们在 uiautomatorviewer 看到的所有属性都能获取的(此处的名称均为使用 get_attribute 时使用的属性名称):

可获取的:

字符串类型:

  • name(返回 content-desc 或 text)
  • text(返回 text)
  • className(返回 class,只有 API=>18 才能支持)
  • resourceId(返回 resource-id,只有 API=>18 才能支持)

布尔类型(如果无特殊说明, get_attribute 里面使用的属性名称和 uiautomatorviewer 里面的一致):

获取不到,但会显示在 uiautomatorviewer 中的属性:

    • index
    • package
    • password
    • bounds(可通过 get_position 来获取其中部分内容)

原文地址:https://www.cnblogs.com/blogofzxf/p/10455394.html

时间: 2024-10-11 01:43:22

关于 appium get_attribute 方法的坑的相关文章

appium简明教程(5)——appium client方法一览

appium client扩展了原生的webdriver client方法 下面以java代码为例,简单过一下appium client提供的适合移动端使用的新方法 resetApp() getAppString() sendKeyEvent() currentActivity() pullFile() pushFile() pullFolder() hideKeyboard() runAppInBackground() performTouchAction() performMultiTouc

appium client方法一览

appium client扩展了原生的webdriver client方法 下面以java代码为例,简单过一下appium client提供的适合移动端使用的新方法 resetApp() getAppString() sendKeyEvent() currentActivity() pullFile() pushFile() pullFolder() hideKeyboard() runAppInBackground() performTouchAction() performMultiTouc

javascript submit()方法的坑

这个我觉得是个坑,因为玩多了jquery,只要通过on方法绑定了submit事件处理,在任何地方提交表单都可以触发. 而原生javascript的onsubmit事件是绑定在"submit按钮"上的,外部按钮执行的提交无法触发onsubmit事件. 还有一个类似的问题: html5带来的原生表单验证是个好东西,可惜一样,只能通过表单内置的submit按钮提交才会触发验证,外部提交无法触发.所以第三方js表单验证插件还是需要的.

Appium公共方法封装

最近在研究Appium+python写Android自动化测试脚本,之前用过selenium+python写web的自动化测试脚本,在此基础上修改. 还是使用POM,一个page页面对应一个test_case,base页面封装一些公共方法.封装的一个查找元素的公共方法: def find_element(self, *loc):        try:            WebDriverWait(self.driver,10,0.5).until(EC.visibility_of_elem

小程序-跳转页面的方法及坑

方法一:WXML页面实现 1.<navigator url = "/pages/aaa/aaa">跳转到新页面</navigator> 2.<navigator url = "/pages/aaa/aaa" open-type = "redirect">跳转到新页面</navigator> 3.<navigator url = "/pages/aaa/aaa" open-t

关于django中的get_or_create方法的坑

最近在项目中发现了这样的一个坑,那就是我们的需求是不能添加一个相同的对象到数据库中,就通过某些字段的值组合成唯一值到数据库中去查找数据,如果没有找到对象,那就创建一条新的数据库记录,而刚好django又提供了这种方法,那就是get_or_create.可是在测试的时候发现会加入相同的对象. 而解决方法就是:其实我们可以从数据库级别来使这几个字段组合唯一,这样如果有重复的数据就会加不进去. class Meta: unique_together = (("xxx", "xxxx

python导入Appium包方法

配置电脑的appium环境: 安装Node.js,去node.js官网下载msi格式的安装文件,下载后安装 1) 下载并安装Node.js http://nodejs.org/dist/v0.10.35/node-v0.10.35-x86.msi 2) 把Node.js的安装路径(也就是node.exe文件所在的目录)添加到环境变量Path ·  安 装appium. node.js安装成功后打开命令行,输入npm install –g appium 命令安装appium,安装完成后在命令行中输

ExecutorService的submit方法的坑

先看一段代码: public Future<?> submit(Runnable task) { if (task == null) throw new NullPointerException(); RunnableFuture<Void> ftask = newTaskFor(task, null); execute(ftask); return ftask; } protected <T> RunnableFuture<T> newTaskFor(Ru

ThinkPHP中的parseDSN方法的坑记录一下

<?php/** * DSN解析 * 格式: mysql://username:[email protected]:3306/DbName * @static * @access public * @param string $dsnStr * @return array */function parseDSN($dsnStr) { if( empty($dsnStr) ){return false;} $info = parse_url($dsnStr); if($info['scheme']