目录
前言:
在 Appium 中,get_attribute 方法是用来获取元素属性的方法。它可以用来获取元素的文本、颜色、位置等属性。
问题描述
当使用类似下面的代码获取元素的 content-desc 属性时,会报 NoSuchElement 错误:
# python
self.driver.find_element_by_id("id").get_attribute("content-desc")
但使用如下代码却能正常执行:
# python
self.driver.find_element_by_id("id").click()
很明显,这个错误原因不是找不到元素,而是 get_attribute 出问题。
问题原因探究
appium server 在 android 原生应用上获取 attribute 的大致流程为:
- 从 client 收到获取 attribute 的请求
- 把请求转发给在手机上运行的 bootstrap
- bootstrap 调用相关方法进行实际操作
- bootstrap 返回结果给 appium server
- appium server 把结果返回给 client
通过排查各部分的代码发现,错误是在 bootstrap 产生的(排查过程涉及代码有点多,所以这里就不解释了),所以看看 bootstrap 相关源码:
lib/devices/android/bootstrap/src/io/appium/android/bootstrap/handler/GetAttribute.java
@Override public AndroidCommandResult execute(final AndroidCommand command) throws JSONException { if (command.isElementCommand()) { // only makes sense on an element final Hashtable<String, Object> params = command.params();
try {