Appium-02day(配置元素及定位元素)

注释
# 这里定义的 desired_capabilities,作为下面 webdriver.Remote
# 初始化一个webdriver的参数。
# 这些键值对告诉appium server 测试程序希望进行的是什么样的测试

desired_caps = {}
desired_caps['platformName'] = 'Android'  

#平台版本,不能写错
desired_caps['platformVersion'] = '7'   

#设备名称,android上随便填写一个值
desired_caps['deviceName'] = 'test'
#apk 文件路径名,如果设备还没有此应用,则会安装。

desired_caps['app'] = r'd:\apk\toutiao.apk'
#app package名,一定要有,是开发者给app取的名字,可以唯一标识这个app
desired_caps['appPackage'] = 'io.manong.developerdaily'

#app启动Activity,也是必须的参数。安卓应用一个Activity 就对应
一个用户操作界面
desired_caps['appActivity'] = 'io.toutiao.android.ui.activity.LaunchActivity'
# 如果我们自动化,要输入的信息里面有中文字符,需要这个参数,否则可以不要
#加上这个参数会新加一种unicode输入法

desired_caps['unicodeKeyboard']  = True

# 表示测试完后,输入法还要还原成原来的,比如原来是搜狗输入法

desired_caps['resetKeyboard']  = True
# 这个noReset参数,非常重要!!

# 保证了app 测试前不会清除数据,缺省是会清除数据的
desired_caps['noReset'] = True


# 我们的测试程序连接上appium server后,appium server 一直等待client 的命令。

 

如果超过一定的时间,没有命令,比如debug的时候,它就会认为客户端已经退出了。就会断开连接

这个参数就是指定多长时间,appium server可以认为连接已经断开了
desired_caps['newCommandTimeout'] = 6000
#启动Remote RPC,将 capability参数传入,

创建一个 webdriver对象, 和Selenium 类似。


driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

try:
    # Selenium含义一样
    driver.implicitly_wait(10)


查看appPackage appActivity 5min


方法1

api保存在电脑上

e:\androidsdk\build-tools\28.0.2\aapt.exe dump badging d:\apk\toutiao.apk

 

 

方法2

如果apk已经安装在手机上了,可以直接打开手机上该应用,进入到你要操作的界面

然后执行

adb shell dumpsys activity recents | find "intent={" > d:\info.txt && d:\info.txt

下面就是最近的N activity 信息,

看第一个

其中高亮部分就是我们要的

    intent={act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.android.mms/.ui.ConversationList}

   adb shell dumpsys activity recents | find "Activities=[" > d:\info.txt && d:\info.txt

 

 

查看界面元素工具uiautomatorviewer 25 min

安卓查看界面元素,最常用的就是 Android SDK 中的 uiautomateviewer,它在目录

.\Android\sdk\tools\bin\

元素的属性:

 index:就是该元素是其父元素的第几个节点,从0开始

text:就是如果该元素对应的界面上有文本内容,就是其文本内容的字符串值,

 

显然这是我们将来非常关心的属性,因为要分析内容,判断是否与预期相同。

比如,最便宜的商品列表

 

resource-id: 是该元素的资源id,一般来说唯一的决定了一个元素,

有点像webid,优先根据它查找。

但是并非每一个元素都会有。如果这样,就需要其他的方法选择

 

class :就是该元素的类型,这是安卓界面元素对应的代码里面的java类,类似html tag名,比如layouttextview

package:就是 所在app的包名

content-desc: 这个属性用来描述该元素的用途,特性等。

bounds : 就是这个元素在界面上的位置, 左上角和右下角的坐标。

以后如果我们黔驴技穷,实在选择不到元素的时候,就根据这个属性直接去根据坐标操作元素了。

 

选择元素的代码也和Selenium基本相同,如下

可以通过

find_element_by_XXX 符合条件的第一个元素,找不到抛出异常

find_elements_by_XXX 符合条件的所有元素的列表,找不到返回空列表

通过WebDriver对象调用这样的方法,查找范围是整个界面树形结构

通过WebElement对象调用这样的方法,查找范围是该节点的子节点 ,


选择元素方式

ID
ele = driver.find_element_by_id('com.example.jcy.wvtest:id/name1')
ele.send_keys('hello world')

 

CLASS NAME

 

class属性决定了界面元素的类型。

 

通常class 就是类似web里面的tagname, 所以通常不是唯一的。

所以大部分情况,我们根据classname 是要选择多个而不是一个。

 

写法是:

driver.find_element_by_class_name('android.widget.DatePicker')

 

大家看一个例子:开发者头条里面的 底部的大加号

android.widget.ImageButton,这个在当前界面上就是一个唯一的.

我们可以根据它查找,


driver.find_element_by_class_name("android.widget.ImageButton").click()

----------------------------------

当然,我们可以根据classname查找所有匹配的元素,这时可以用

driver.find_elements_by_class_name

 


# 这一步是为了防止 界面刚出来的时候,还没显示全,就去获取所有的textview
driver.find_element_by_class_name("android.widget.ImageButton")

time.sleep(2)
tvs = driver.find_elements_by_class_name("android.widget.TextView")
for tv in tvs:
    print(tv.text)

 

9 ACCESSIBILITY ID 5 min

content-desc属性时用来描述该元素的作用的。

要查询的界面元素的 content-desc属性 在当前界面中唯一 我们可以通过它来定位。

写法

driver.find_element_by_accessibility_id('xxx')

 


网友评论

3条评论

发表

最新评论

06月20日 17:29

虎嗅蔷薇 0

你这是又在捣鼓啥
看着好高端 大气的样子
好厉害

  • 上官婉儿  : 哈哈。这是小儿科的啦

    2019-06-20 11:06 0

06月20日 09:44

推荐文章

uedbet官网

Copyright © 2008-2019 uedbet官网社区(http://www.jdylc413.com) 版权所有 All Rights Reserved.

免责声明: 本网不承担任何由内容提供商提供的信息所引起的争议和法律责任。

经营许可证编号:滇B2-20090009 - 滇ICP备06007192号

下载我家uedbet体育APP 下载uedbet官网社区APP