在模拟器中对Android APP进行appium自动测试密码输入,但是xml文件中缺少密码输入字段

问题描述

我正在使用appium-desktop记录Android模拟器(UI为https://medium.com/better-programming/tinder-like-swiper-ui-for-angular-ionic-4-50c401d6b9fb)上的android APP的密码(8个字符)输入功能,以了解如何编写python脚本来自动测试该功能。我无法弄清楚哪个元素可以发送密钥以输入密码(我附上了xml文件,该文件最后输入2个字符的密码(总共8个字符)供您参考。 我尝试选择最可能的元素(例如com.test.android.test:id / cb_1,cb_2,...)在appium-desktop的inspect功能中将以下错误发送给密钥:

调用“ sendKeys”失败 [element.sendKeys(“ w”)]错误响应状态:12,InvalidElementState-元素命令无法完成,因为该元素处于无效状态(例如,尝试单击禁用的元素)。硒错误:无法将元素设置为“ w”。您是否与正确的元素进行了互动?

我进行了一些调查,发现输入密码的一个字符后,对应的id / cb_1从'checked = false'变为'checked = true'(附加的xml文件在输入2个字符后被清除,因此cb_1和cb_2的'checked = true'和其他(cb_n)的'checked = false'),xml文件中没有其他更改。所以我的问题是我应该如何编写输入8个字符的密码的python代码以使appium自动执行测试。

有人可以给我一些提示或建议吗?谢谢你的帮助!非常感谢您的建议!

<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<hierarchy index="0" class="hierarchy" rotation="3" width="900" height="1600">
  <android.widget.FrameLayout index="0" package="com.test.android.test" class="android.widget.FrameLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,0][900,1600]" displayed="true">
    <android.widget.LinearLayout index="0" package="com.test.android.test" class="android.widget.LinearLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,1600]" displayed="true">
      <android.widget.FrameLayout index="0" package="com.test.android.test" class="android.widget.FrameLayout" text="" resource-id="android:id/content" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,1600]" displayed="true">
        <android.widget.RelativeLayout index="0" package="com.test.android.test" class="android.widget.RelativeLayout" text="" resource-id="com.test.android.test:id/root_view" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,1600]" displayed="true">
          <android.widget.LinearLayout index="0" package="com.test.android.test" class="android.widget.LinearLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,48][900,604]" displayed="true">
            <android.widget.FrameLayout index="0" package="com.test.android.test" class="android.widget.FrameLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,118]" displayed="true">
              <android.widget.FrameLayout index="0" package="com.test.android.test" class="android.widget.FrameLayout" text="" resource-id="com.test.android.test:id/btn_close_area" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,48][110,118]" displayed="true">
                <android.widget.ImageView index="0" package="com.test.android.test" class="android.widget.ImageView" text="" resource-id="com.test.android.test:id/btn_left" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[30,61][74,105]" displayed="true" />
              </android.widget.FrameLayout>
            </android.widget.FrameLayout>
            <android.widget.LinearLayout index="1" package="com.test.android.test" class="android.widget.LinearLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,118][900,192]" displayed="true">
              <android.widget.TextView index="0" package="com.test.android.test" class="android.widget.TextView" text="your account will be locked if retrying password errors over 5 times" resource-id="com.test.android.test:id/hint" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,192]" displayed="true" />
            </android.widget.LinearLayout>
            <android.widget.LinearLayout index="2" package="com.test.android.test" class="android.widget.LinearLayout" text="" resource-id="com.test.android.test:id/pwd_input_fl" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,324][900,604]" displayed="true">
              <android.widget.RelativeLayout index="0" package="com.test.android.test" class="android.widget.RelativeLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,367]" displayed="true">
                <android.widget.TextView index="0" package="com.test.android.test" class="android.widget.TextView" text="pls input your password" resource-id="com.test.android.test:id/dialog_verify_password_title" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[306,324][594,367]" displayed="true" />
              </android.widget.RelativeLayout>
              <android.widget.RelativeLayout index="1" package="com.test.android.test" class="android.widget.RelativeLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,427][900,511]" displayed="true">
                <android.widget.LinearLayout index="1" package="com.test.android.test" class="android.widget.LinearLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[24,427][876,511]" displayed="true">
                  <android.widget.FrameLayout index="0" package="com.test.android.test" class="android.widget.FrameLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[24,427][130,511]" displayed="true">
                    <android.widget.CheckBox index="0" package="com.test.android.test" class="android.widget.CheckBox" text="" resource-id="com.test.android.test:id/cb_1" checkable="true" checked="true" clickable="true" enabled="true" focusable="true" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[55,447][99,491]" displayed="true" />
                  </android.widget.FrameLayout>
                  <android.widget.FrameLayout index="1" package="com.test.android.test" class="android.widget.FrameLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[130,427][236,511]" displayed="true">
                    <android.widget.CheckBox index="0" package="com.test.android.test" class="android.widget.CheckBox" text="" resource-id="com.test.android.test:id/cb_2" checkable="true" checked="false" clickable="true" enabled="true" focusable="true" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[161,447][205,491]" displayed="true" />
                  </android.widget.FrameLayout>
                  <android.widget.FrameLayout index="2" package="com.test.android.test" class="android.widget.FrameLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[236,427][342,511]" displayed="true">
                    <android.widget.CheckBox index="0" package="com.test.android.test" class="android.widget.CheckBox" text="" resource-id="com.test.android.test:id/cb_3" checkable="true" checked="false" clickable="true" enabled="true" focusable="true" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[267,447][311,491]" displayed="true" />
                  </android.widget.FrameLayout>
                  <android.widget.FrameLayout index="3" package="com.test.android.test" class="android.widget.FrameLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[342,427][448,511]" displayed="true">
                    <android.widget.CheckBox index="0" package="com.test.android.test" class="android.widget.CheckBox" text="" resource-id="com.test.android.test:id/cb_4" checkable="true" checked="false" clickable="true" enabled="true" focusable="true" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[373,447][417,491]" displayed="true" />
                  </android.widget.FrameLayout>
                  <android.widget.FrameLayout index="4" package="com.test.android.test" class="android.widget.FrameLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[448,427][555,511]" displayed="true">
                    <android.widget.CheckBox index="0" package="com.test.android.test" class="android.widget.CheckBox" text="" resource-id="com.test.android.test:id/cb_5" checkable="true" checked="false" clickable="true" enabled="true" focusable="true" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[479,447][523,491]" displayed="true" />
                  </android.widget.FrameLayout>
                  <android.widget.FrameLayout index="5" package="com.test.android.test" class="android.widget.FrameLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[555,427][662,511]" displayed="true">
                    <android.widget.CheckBox index="0" package="com.test.android.test" class="android.widget.CheckBox" text="" resource-id="com.test.android.test:id/cb_6" checkable="true" checked="false" clickable="true" enabled="true" focusable="true" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[586,447][630,491]" displayed="true" />
                  </android.widget.FrameLayout>
                  <android.widget.FrameLayout index="6" package="com.test.android.test" class="android.widget.FrameLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[662,427][769,511]" displayed="true">
                    <android.widget.CheckBox index="0" package="com.test.android.test" class="android.widget.CheckBox" text="" resource-id="com.test.android.test:id/cb_7" checkable="true" checked="false" clickable="true" enabled="true" focusable="true" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[693,447][737,491]" displayed="true" />
                  </android.widget.FrameLayout>
                  <android.widget.FrameLayout index="7" package="com.test.android.test" class="android.widget.FrameLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[769,511]" displayed="true">
                    <android.widget.CheckBox index="0" package="com.test.android.test" class="android.widget.CheckBox" text="" resource-id="com.test.android.test:id/cb_8" checkable="true" checked="false" clickable="true" enabled="true" focusable="true" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[800,447][844,491]" displayed="true" />
                  </android.widget.FrameLayout>
                </android.widget.LinearLayout>
              </android.widget.RelativeLayout>
              <android.widget.TextView index="2" package="com.test.android.test" class="android.widget.TextView" text="forgot password?" resource-id="com.test.android.test:id/btn_forget_password" checkable="false" checked="false" clickable="true" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,571][900,604]" displayed="true" />
            </android.widget.LinearLayout>
          </android.widget.LinearLayout>
        </android.widget.RelativeLayout>
      </android.widget.FrameLayout>
    </android.widget.LinearLayout>
  </android.widget.FrameLayout>
</hierarchy>

解决方法

正如我在这里看到的,此应用程序的android开发人员将checkBox用作密码占位符而不是输入。这是错误的,没有人在实际生产中这样做。 而且UiAutomator不允许您将密钥发送到复选框。

无论如何,如果这是测试的示例apk,请尝试driver.set_text("password")到复选框的父元素(LinearLayout或FrameLayout)。如果失败,请致电应用程序开发人员!

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...