Appium基础2

UIAutomatorViewer介绍

  • UIAutomatorViewer用来扫描和分析Android应用程序的UI控件的工具
  • 应用场景
    • 定位元素的时候必须根据元素的相关特征来进行定位,而UIAutomatorViewer就是用来获取元素特征
  • 使用步骤
    1. 进入SDK目录下的目录
      • mac 在 tools/bin 目录下,打开 uiautomatorviewer
      • windows 在 tools 目录下,打开 uiautomatorviewer.bat
    2. 电脑连接真机或打开android模拟器
    3. 启动待测试app,确保想要查看的元素在当前屏幕上
    4. 点击 uiautomatorviewer 的左上角 Device Screenshot(从左数第二个按钮)
    5. 点击希望查看的控件
    6. 查看右下角Node Detail 相关信息

 元素定位操作API

【定位一个元素】

  • 方法名
    • 通过id定位:driver.find_element_by_id(id_value) 
      • id_value:元素的resource-id属性值
    • 通过class_name定位:driver.find_element_by_class_name(class_value)
      • class_value:元素的class属性值
    • 通过xpath定位:driver.find_element_by_xpath(xpath_value)
      • xpath_value:元素的xpath表达式
  • 示例
# id方式 定位”放大镜“按钮,并点击
driver.find_element_by_id("com.android.settings:id/search").click()
# class方式 定位“输入框”,输入“hello”
driver.find_element_by_class_name("android.widget.Editrext").send_keys("he11o")
# xpath方式 定位“返回”按钮,并点击
driver.find_element_by_xpath("//*[@content-desc='收起']").c1ick()

【定位一组元素】

  • 方法名
    • 通过id定位:driver.find_elements_by_id(id_value) 
      • id_value:元素的resource-id属性值
      • 返回的所有符合id_value的元素,返回一个列表
    • 通过class_name定位:driver.find_elements_by_class_name(class_value)
      • class_value:元素的class属性值
    • 通过xpath定位:driver.find_elements_by_xpath(xpath_value)
      • xpath_value:元素的xpath表达式

注意点

 核心代码

driver.find_element_by_id("xxx")

driver.find_elements_by_id("xxx")

1. 如果使用 driver.find_element_by_xx 方法,如果传入一个没有的特征,会报NoSuchElementException的错误

2. 如果使用 driver.find_elements_by_xx 方法,如果传入一个没有的特征,不会报错,会返回一个空列表

元素等待

  • 应用场景
    • 可能由于一些原因,我们想找的元素并没有立刻出来,此时如果直接定位可能报错,比如以下原因
      • 网络速度原因
      • 服务器处理请求原因
      • 电脑配置原因
  • 概念
    • WebDriver定位页面元素时如果未找到,会在指定时间内一直等待的过程

隐式等待

  • 应用场景
    • 针对所有定位元素的超时时间设置为同一值的时候
  • 概念
    • 等待元素加载指定的时长,超出时长抛出NoSuchElementException异常
  • 步骤
    • 在获取driver对象后,调用implicitly_wait方法即可
  • 示例
from selenium.webdriver.support.wait import WebDriverwait

#-----
# 启动应用参数
#-----

driver.implicity_wait(5)
search_button = driver.find_element_by_xpath("//*[contains(@content-desc,'收起')]")
search button.click()

显式等待

  • 应用场景
    • 针对所有定位元素的超时时间设置为不同值的时候
  • 概念
    • 等待元素加载指定的时长,超出时长抛出NoSuchElementException异常
  • 步骤
    • 导包
    • 创建WebDriverWait对象
    • 调用WebDriverWait对象的until方法
  • 示例
from selenium.webdriver.support.wait import WebDriverwait

#-----
# 启动应用参数
#-----

#创建webDriverwait对象
wait = webDriverwait(driver, 5, po11_frequency=1)
# 获取元素并设置超时时间和频率
search_button = wait.until(lambda x: x.find_element_by_xpath("//*[contains(@content-desc,'收起')]"))
# 点击搜索按钮
search_button.click()

隐式等待和显式等待的选择

  • 作用域
    • 显式等待为单个元素有效,隐式为全局元素
  • 方法
    • 显式等待方法等装在 WebDriverWait 类中,而隐式等待则直接通过 driver 实例化对象调用
  • 关于sleep的形式?
    • sleep式固定死一个时间,不是不行,但是不推荐
    • 元素等待可以让元素出来的第一时间进行操作,sleep可能造成不必要的浪费

元素操作API

  • 点击元素
    • element.click()
  • 输入和清空输入框内容
    • element.send_keys(value)
    • element.clear()
  • 获取元素的文本内容
    • element.text
  • 获取元素的位置和大小
    • element.location
      • 返回是一个字典,字典中有 x 和 y 两个key(数据类型是int)
    • element.size
      • 返回是一个字典,字典中有 width 和height 两个key(数据类型是int)
  • 获取元素的属性值
    • element.get_attribute(value)  # value: 元素的属性
    • 注意点

      value='name' 返回content-desc/text的属性值

      value='className' 返回class属性值,只有API=>18才能支持

      value='resourceId' 返回resource-id属性值,只有API=>18才能支持

      其他的,都可以参考 uiautomator viewer 中的属性名

 滑动和拖拽事件

  • 应用场景
    • 使用代码模拟手指的滑动

swipe滑动屏幕

  • 概念
    • 从一个坐标位置滑动到另一个坐标位置,只能是两个点之间的滑动
  • 方法名
    • driver.swipe(start_x, start_y, end_x, end_y, duration=None)
    • duration: 滑动这个操作一共持续的时间长度,单位:ms
  • 小结

    距离相同时,持续时间越长,惯性越小

    持续时间相同时,手指滑动的距离越大,实际滑动的距离也越大

scroll滑动屏幕

  • 概念
    • 从一个元素滑动到另一个元素,直到页面自动停止
  • 方法名
    • driver.scroll(origin_el, destination_el)
  • 示例
# 从"存储"滑动到"更多"
save_button = driver.find_element_by_xpath("//*[@text='存储']")
more_button = driver.find_element_by_xpath("//*[@text='更多']")
driver.scro1l(save_button, more_button)

drag_and_drop滑动屏幕

  • 概念
    • 从一个元素滑动到另一个元素,第二个元素替代第一个元素原来屏幕上的位置
  • 方法名
    • driver.drag_and_drop(origin_el, destination_el)
  • 示例
# 从"存储"滑动到"更多"
save_button = driver.find_element_by_xpath("//*[@text='存储']")
more_button = driver.find_element_by_xpath("//*[@text='更多']")
driver.scro1l(save_button, more_button)

滑动和推拽事件的选择

滑动和拖拽无非就是考虑是否有“惯性”,已经传递的参数是“坐标”还是“元素”。

可以分为以下四种情况

  • 有惯性,传入元素
    • scroll
  • 无惯性,传入元素
    • drag_and_drop
  • 有惯性,传入坐标
    • swipe, 并设置较短的 duration 时间
  • 无惯性,传入坐标
    • swipe, 并设置较长的 duration 时间

高级手势TouchAction

  • 应用场景
    • TouchAction可以实现一些针对手势的操作,比如滑动、长按、拖动等。我们可以将这些基本手势组合成一个相对复杂的手势。比如,解锁手机或者一些应用软件都有手势解锁这种方式
  • 使用步骤
    • 创建 TouchAction 对象
    • 通过对象调用想执行的手势
    • 通过 perform() 执行动作
  • 注意点

    所有手势都要通过 perform() 函数才会运行

手指轻敲操作

  • 应用场景
    • 模拟手指对某个元素或坐标按下并快速的抬起
  • 方法名
    • TorchAction(driver).tap(element=None, x=None, y=None).perform()

手势按下和抬起操作

  • 应用场景
    • 模拟手指一直按下,模拟手指抬起。可以组合成轻敲或长按的操作
  • 方法名
    • TorchAction(driver).press(element=None, x=None, y=None).perform()
    • TorchAction(driver).release().perform()

等待操作

  • 应用场景
    • 模拟手指等待,比如按下后等待5秒之后再抬起
  • 方法名
    • TorchAction(driver).wait(ms=0).perform()

长按操作

  • 应用场景
    • 模拟手指对元素或坐标的长按操作。比如,长按某个按钮弹出菜单
  • 方法名
    • TorchAction(driver).long_press(element=None, x=None, y=None, duration=1000).perform()

手指移动操作

  • 应用场景
    • 模拟手指移动操作,比如手势解锁需要先按下,再移动
  • 方法名
    • TorchAction(driver).move_to(element=None, x=None, y=None).perform()

手机操作API

获取手机分辨率

  • 应用场景
    • 自动化测试可能会需要根据当前设备的分辨率来计算一些点击或滑动的坐标
  • 方法名
    • driver.get_window_size()

手机截图

  • 应用场景
    • 有些自动化的操作可能没有反应,但并不报错。此时就可以操作过后的关键情况,截图留存。后期也可以根据图片发现问题
  • 方法名
    • driver.get_screenshot_as_file(filename)

获取和设置手机网络

  • 应用场景
    • 视频应用在使用流量看视频的时候,大部分都会提示用户正在是否继续播放。作为测试人员,我们可能需要用自动化的形式来判断是否有对应的提示。即,用流量的时候应该有提示,不用流量的时候应该没有提示。
  • 方法名
    • driver.network_connection
    • driver.set_network_connection(connectionType)
    • connectionType:
      • 0 (None)
      • 1 (Airplane Mode)
      • 2 (wifi only)
      • 4 (Data only)
      • 6 (All network on)

发送键到设备

  • 应用场景
    • 模拟按“返回键”“home键”等操作,比如,很多应用有按两次返回键退出应用的功能。
  • 方法名
    • driver.press_keycode(keycode, metastate=None)
    • keycode: 发送给设备的关键代码 metastate: 关于被发送的关键代码的元信息,一般为默认值
  • 注意点

    按键对应的编码,可以在百度搜索关键字 “android keycode”

操作手机通知栏

  • 应用场景
    • 测试即时通信类软件的时候,如果A给B发送一条消息,B的通知栏肯定会显示对应的消息。我们想通过通知栏来判断B是否收到消息,一定要先操作手机的通知栏
  • 方法名
    • driver.open_notifications()
  • 注意点

    appium官方并没有提供关闭通知的api,那么现实生活中怎么关闭,就怎样操作就行。比如,手指从下往上滑,或者,按返回键

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值