App定位元素与API

一,AndroidDriver初始化

1.1,准备工作,获取测试包的信息

步骤:

  1:从appium中引入webdriver

  2:添加配置
  deviceName:设备名称
  platformName:测试平台
  platformVersion:平台版本
  appPackage:测试app包名
  appActivity:测试app启动入口
    adb shell dumpsys window windows | findstr mFocusedApp
    adb shell dumpsys activity | find "mFocusedActivity"
  3:创建驱动

1.2,创建代码:

# 导入webdriver
from appium import webdriver
# 添加配置
desired_caps={
    'platformName':'Android',
    'PlatforVersion':'8.0.1',
    'deviceName':'8.0.1',
    'appPackage':'baoming',
    'appActivity':'activity',
}
# 创建驱动
driver=webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps)

 二,APP元素定位及操作

2.1,Appium常用元素定位方法

id定位,name定位(text定位),class_name定位,accessibility_id定位,xpath定位,ANDROID_UIAUTOMATOR定位。

 2.1.1 id定位:

id定位是使用控件的resource-id进行定位的

driver.findElement(By.id("com.android.calculator2:id/digit5")).click();//点击5
driver.find_element_by_id("com.android.calculator2:id/digit5")

 

 2.1.2name定位元素

text代表name属性

driver.findElement(By.name("5")).click();
driver.find_element_by_name("5")

2.1.3使用class Name定位元素

Class Name 定位是使用控件的class属性进行定位,class属性定位出元素有可能有很多,返回的是一个列表

driver.findElements(By.className("android.widget.Button"))
driver.find_element_by_class_name("android.widget.Button")

2.1.4使用xpath定位元素

 driver.findElement(By.xpath("//android.widget.TextView[@text='New message']")).click();

2.1.5使用ANDROID_UIAUTOMATOR定位元素

该方法属于appium的扩展方法,并且只支持Android平台。支持元素全部属性定位.定位原理是通过android 自带的android uiautomator的类库去查找元素。 Appium元素定位方法其实也是基于Uiautomator来进行封装的。
# id 定位
driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.tal.kaoyan:id/login_email_edittext")')

# text定位
driver.find_element_by_android_uiautomator('new UiSelector().text("请输入用户名")')

# textContains定位
driver.find_element_by_android_uiautomator('new UiSelector().textContains("请输入用户名")')

# description定位
driver.find_element_by_android_uiautomator('new UiSelector().description("请输入用户名")')

# class name定位
driver.find_element_by_android_uiautomator('new UiSelector().className("android.widget.EditText")')

#组合定位id+text
id_text = 'new UiSelector().resourceId("com.baidu.yuedu:id/webbooktitle").text("小说")'
driver.find_element_by_android_uiautomator(id_text).click()

# 滚动到指定位置
driver.find_element_by_android_uiautomator('new UiScrollable('
                                                    'new UiSelector().scrollable(true).instance(0))'
                                                    '.scrollIntoView('
                                                    'new UiSelector().text("Views").instance(0));').click()

2.1.6Accessibility id 定位

 该方法属于appium扩展的定位方法, 它的核心是找到控件的contentDescription属性

 content-desc属性对应AccessibilityId定位方式,如果这个属性不为空则推荐使用

driver.find_element_by_accessibility_id("天猫超市").click()

 2.2元素组定位

其中id定位,name定位,accessibility_id,xpath定位都有元素组定位的方式,定位到的多个元素存储 在一个列表中,可以通过下标的方式来操作元素

1. driver.find_elements_by_id()

2. driver.find_elements_by_name()

3. driver.find_elements_by_accessibility_id()

4. driver.find_elements_by_xpath()

 2.3元素属性的操作

1, text属性 ele.text   获取元素的文本值

element = driver.find_element(*(MobileBy.ANDROID_UIAUTOMATOR, 'new UiSelector().text("同意")'))
print(element.text) # 同意

2, location属性    ele.location 获取元素的坐标

element = driver.find_element(*(MobileBy.ANDROID_UIAUTOMATOR, 'new UiSelector().text("同意")'))
print(element.size) #{'height': 96, 'width': 178}

3, size属性 ele.size    获取元素的大小

element = driver.find_element(*(MobileBy.ANDROID_UIAUTOMATOR, 'new UiSelector().text("同意")'))
print(element.location ) # {'x': 204, 'y': 376}

4,get_attribute属性,ele.get_attribute()获取元素某个标签的属性值

element = driver.find_element(*(MobileBy.ANDROID_UIAUTOMATOR, 'new UiSelector().text("同意")'))
print("tag_name:", element.get_attribute("class")) # tag_name: android.widget.Button

三,Appium的基础操作

3.1 常用API:

  1. 关闭app:driver.close_app()

  2. 启动app:driver.launch_app

  3. 重置应用(类似删除应用数据):driver.reset()

  4. 后台运行app:driver.background_app(s)  s:后台运行时间,单位秒

  5. 检查app是否有安装:driver.is_app_installed(包名)    返还True/False

  6. 安装app:driver.install_app(app_path)

  7. 删除app:driver.remove_app(包名)   

  8. 打系统通知栏:driver.open_notifications()

  9. 截取当前窗口的截图:driver.get_screenshot_as_file('c:/foo.png')

  10. 获取屏幕分辨率:driver.get_window_size()

  11. 拖动元素:driver.drag_and_drop(ele1,ele2)

四,Appium的手势操作

4.1,点击操作(相当于触摸操作)driver.tap(positions,time)

positions是列表类型,如:[(x1,y1),(x2,y2)]:两个坐标,x1,y1为第一个坐标,x2,y2为第二个坐 标,每个坐标用括号括起来,最多支持5个坐标点,这个左边都是放在一个列表中,所以要用[]括 起来

 time:为点击按钮的延迟时间,单位为ms 

driver.tap(x * 0.5, y * 0.5)

4.2,滑动:driver.swipe(startx,starty,endx,endy,duration) 

 def swipe_down(self):
        size = self.get_size()
        x = size['width']
        y = size['height']
        self.driver.swipe(x * 0.5, y * 0.9, x * 0.5, y * 0.1)

4.3,TouchAction辅助类:连续性操作 

在有些时候,单独的某个方法并不能满足模拟用户的操作,例如模拟用户解锁屏幕,就 需要一系列操作合起来才能实现,此时就要用到TouchAction类。 

在Appium中,TouchAction的原理是将一系列的动作放到一个链条中,然后将该链条传递 给服务器,服务器接收后解析各个动作,逐个执行。
  TouchAction的操作:

    1, 导入TouchAction的包:from appium.webdriver.common.touch_action import TouchAction

    2,TouchAction支持的方法

      2.1. 短按 press(self, el=None, x=None, y=None)

      2.2. 长按 long_press(self, el=None, x=None, y=None, duration=1000(ms))

      2.3. 释放 release(self)

      2.4. 移动到 move_to(self,el=None,x=None,y=None)

      2.5. 点击 tap(self,el=None,x=None,y=None,count=1)

      2.6. 等待 wait(self,ms=0) 7. 执行 perform(self)

 

 

 4.4 MultiTouchAction类:多点触摸 

Ø 多点触摸对象是触摸动作的集合,是TouchAction的一个补充模块,通常都结合TouchAction 模拟多根手指滑动效果。

Ø MultiTouchAction操作:

  1. 导入MultiTouchAction包:from appium.webdriver.common.multi_action import MultiAction

  2. MultiTouchAction支持方法:

     • 添加触摸操作到多点触摸    add(self, *touch_actions)

     • 执行 perform(self)

 

五,Appium键盘事件

5.1 键盘事件

Ø 在进行移动应用自动测试的过程中,经常会碰到一些特殊情况,如打开视频后想要关闭视频,在这 种情况自动化测试脚本中是无法通过在界面中进行元素定位来实现的,此时需要通过手机自带的返 回键来完成操作,而且对于调节音量,锁屏,关机等操作都少不了键盘来完成。

Ø 在Appium中提供了专门的函数来实现对系统自身按键的操作

  1. driver.keyevent(4)   发送按键码(安卓仅有)

  2. driver.press_ keycode(4) 发送按键码(安卓仅有)

  3. driver.long_press_keycode(4) 发送一个长按的按键码(长按某键

 5.2 Android adb keyevent 键值大全

连接:https://blog.csdn.net/sinat_27672523/article/details/88748398

 

 六,Appium Activity事件

Ø Activity:android四大组件之一,简单来说就是一个界面,和用户进行交互,如桌面(Launcher)

1. driver.current_activity 获取当前的activity

2. driver.wait_activity(self, activity, timeout, interval=1)  等待指定的activity出现直到超时 • Activity:android特有的 • timeout - 最大超时时间,单位是s • interval - 循环查询时间,间隔1秒 即每隔几秒获取一次当前的

3. driver.start_activity(app_package, app_activity)   实现页面跳转(包括App内部页面及App相互跳转) • app_package:包名 • app_activity:跳转的页面

 

 

posted @ 2020-10-26 22:56  勇敢面对difficult  阅读(161)  评论(0)    收藏  举报