app基础操作api

前置代码
# This sample code uses the Appium python client
# pip install Appium-Python-Client
# Then you can paste this into a file and simply run with Python

from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
import time

caps = {}
caps["platformName"] = "Android"
caps["deviceName"] = "SM-N9760"
caps["platformVersion"] = "7.1.2"
caps["appPackage"] = "com.android.settings"
caps["appActivity"] = "com.android.settings.Settings"

driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)

通过id定位

方法:find_element_by_id(id_value)  #id_value:为元素的id属性值

代码实现:

driver.find_element_by_id("com.android.settings:id/search").click()

driver.quit()

通过class定位

方法:find_element_by_class_name(class_value) # class_value:为元素的class属性值

代码实现:
    # id 点击搜索按钮
    driver.find_element_by_id("com.android.settings:id/search").click()
    # class 点击输入框返回按钮
    driver.find_element_by_class_name('android.widget.ImageButton').click()
    driver.quit()

通过xpath定位

 

方法:find_element_by_xpath(xpath_value) # xpath_value:为可以定位到元素的xpath语句

 

代码实现:
        # xpath 点击WLAN按钮
        driver.find_element_by_xpath("//*[contains(@text,'WLA')]").click()

通过id方式定位一组元素

方法: find_elements_by_id(id_value) # id_value:为元素的id属性值

代码实现:
        # 定位到一组元素
        title = driver.find_elements_by_id("com.android.settings:id/title")
        # 打印title类型,预期为list
        print(type(title))
        # 取title返回列表中的第一个定位对象,执行点击操作
        title[0].click()

通过class方式定位一组元素

方法:find_elements_by_class_name(class_value) # class_value:为元素的class属性值
代码实现:
        # 定位到一组元素
        title = driver.find_elements_by_class_name("android.widget.TextView")
        # 打印title类型,预期为list
        print(type(title))
        # 取title返回列表中的第一个定位对象,执行点击操作
        title[3].click()

通过xpath方式定位一组元素
方法:find_elements_by_xpath(xpath_value) # xpath_value:为可以定位到元素的xpath语句
 代码实现:
        # 定位到一组元素
        title = driver.find_elements_by_xpath("//*[contains(@class,'widget.TextView')]")
        # 打印title类型,预期为list
        print(type(title))
        # 取title返回列表中的第一个定位对象,执行点击操作
        title[3].click()

WebDriverWait 显示等待操作
方法:WebDriverWait(driver, timeout, poll_frequency).until(method)
代码实现:
        from selenium.webdriver.support.wait import WebDriverWait # 导入WebDriverWait类
        # 超时时间为30s,每隔1秒搜索一次元素是否存在,如果元素存在返回定位对象并退出
        search_button = WebDriverWait(driver, 30, 1).until(lambda driver: driver.find_element_by_id("com.android.settings:id/search"))
        search_button.click()
        driver.quit()

发送数据到输入框
方法:send_keys(vaue) # value:需要发送到输入框内的文本
代码实现:
        # 点击搜索按钮
        driver.find_element_by_id("com.android.settings:id/search").click()
        # 定位到输入框并输入abc
        driver.find_element_by_id("android:id/search_src_text").send_keys("abc")

    重点:
        大家可以将输入的abc 改成 输入中文,得到的结果:输入框无任何值输入且程序不会抱错
解决输入中文问题:

        1.server 启动参数增加两个参数配置
            desired_caps['unicodeKeyboard'] = True
            desired_caps['resetKeyboard'] = True

        2.再次运行会发现运行成功
            # 点击搜索按钮
            driver.find_element_by_id("com.android.settings:id/search").click()
            # 定位到输入框并输入abc
            driver.find_element_by_id("android:id/search_src_text").send_keys("博客")

清空输入框内容
方法:clear()
代码实现:
      # 点击搜索按钮
      driver.find_element_by_id("com.android.settings:id/search").click()
      # 定位到输入框并输入abc
      input_text = driver.find_element_by_id("android:id/search_src_text")
      # 输入abc
      input_text.send_keys("abc")
      time.sleep(1)
      # 删除abc
      input_text.clear()

获取元素的文本内容
方法: text
代码实现:
      text_vlaue = driver.find_elements_by_class_name("android.widget.TextView")
      for i in text_vlaue:
          print(i.text)

获取元素的属性值
方法: get_attribute(value) # value:元素的属性
  ⚠️ value='name' 返回content-desc / text属性值
  ⚠️ value='text' 返回text的属性值
  ⚠️ value='className' 返回 class属性值,只有 API=>18 才能支持
  ⚠️ value='resourceId' 返回 resource-id属性值,只有 API=>18 才能支持
代码实现:
      # 定位到搜索按钮
      get_value = driver.find_element_by_id("com.android.settings:id/search")
      print(get_value.get_attribute("content-desc"))

获取元素在屏幕上的坐标
方法:location
代码实现:
      # 定位到搜索按钮
      get_value = driver.find_element_by_id("com.android.settings:id/search")
      # 打印搜索按钮在屏幕上的坐标
      print(get_value.location)

获取app包名和启动名
获取包名方法:current_package
获取启动名:current_activity
代码实现:
      print(driver.current_package)
      print(driver.current_activity)

swip滑动事件
⚠️从一个坐标位置滑动到另一个坐标位置,只能是两个点之间的滑动
  方法:swipe(start_x, start_y, end_x, end_y, duration=None)
  参数:
      1.start_x:起点X轴坐标
      2.start_y:起点Y轴坐标
      3.end_x:  终点X轴坐标
      4.end_y,: 终点Y轴坐标
      5.duration: 滑动这个操作一共持续的时间长度,单位:ms
代码实现:
      # 滑动没有持续时间
      driver.swipe(188,659,148,248)
      # 滑动持续5秒的时间
      driver.swipe(188,659,148,248,5000)

scroll滑动事件
⚠️ 从一个元素滑动到另一个元素,直到页面自动停止
  方法:scroll(origin_el, destination_el)
  参数:
      1.origin_el:滑动开始的元素
      2.destination_el:滑动结束的元素
代码实现:
      # 定位到存储菜单栏
      el1 = driver.find_element_by_xpath("//*[contains(@text,'存储')]")
      # 定位到WLAN菜单栏
      el2 = driver.find_element_by_xpath("//*[contains(@text,'WLAN')]")
      # 执行滑动操作
      driver.scroll(el1,el2)

drag拖拽事件
⚠️ 从一个元素滑动到另一个元素,第二个元素替代第一个元素原本屏幕上的位置
  方法:drag_and_drop(origin_el, destination_el)
代码实现:
      # 定位到存储菜单栏
      el1 = driver.find_element_by_xpath("//*[contains(@text,'存储')]")
      # 定位到WLAN菜单栏
      el2 = driver.find_element_by_xpath("//*[contains(@text,'WLAN')]")
      # 执行滑动操作
      driver.drag_and_drop(el1,el2)

应用置于后台事件
 APP放置后台,模拟热启动
  方法:background_app(seconds)
代码实现:
      driver.background_app(5)

手指轻敲操作

 模拟手指轻敲一下屏幕操作
  方法:tap(element=None, x=None, y=None)
  方法:perform() # 发送命令到服务器执行操作

代码实现:
      # 通过元素定位方式敲击屏幕
      el = driver.find_element_by_xpath("//*[contains(@text,'WLAN')]")
      TouchAction(driver).tap(el).perform()

      # 通过坐标方式敲击屏幕,WLAN坐标:x=155,y=250
      # TouchAction(driver).tap(x=155,y=250).perform()

手指按操作
方法:press(el=None, x=None, y=None)
  方法:release() # 结束动作,手指离开屏幕
  参数:
      1.element:被定位到的元素
      2.x:通常会使用元素的X轴坐标
      3.y:通常会使用元素的Y轴坐标
代码实现:
      # 通过元素定位方式按下屏幕
      el = driver.find_element_by_xpath("//*[contains(@text,'WLAN')]")
      TouchAction(driver).press(el).release().perform()

      # 通过坐标方式按下屏幕,WLAN坐标:x=155,y=250
      # TouchAction(driver).press(x=155,y=250).release().perform()

等待操作
方法:wait(ms=0)
  参数:
      ms:暂停的毫秒数
代码实现:
      # 点击WLAN
      driver.find_element_by_xpath("//*[contains(@text,'WLAN')]").click()
      # 定位到WiredSSID
      el =driver.find_element_by_id("android:id/title")
      # 通过元素定位方式长按元素
      TouchAction(driver).press(el).wait(5000).perform()

      # 通过坐标方式模拟长按元素
      # 添加等待(有长按)/不添加等待(无长按效果)
      # TouchAction(driver).press(x=770,y=667).wait(5000).release().perform()

手指长按操作
方法:long_press(el=None, x=None, y=None, duration=1000)
  参数:
      1.element:被定位到的元素
      2.x:通常会使用元素的X轴坐标
      3.y:通常会使用元素的Y轴坐标
      4.duration:持续时间,默认为1000ms
代码实现:
      # 点击WLAN
      driver.find_element_by_xpath("//*[contains(@text,'WLAN')]").click()
      # 定位到WiredSSID
      el =driver.find_element_by_id("android:id/title")
      # 通过元素定位方式长按元素
      TouchAction(driver).long_press(el,duration=5000).release().perform()

      # 通过坐标方式长按元素,WiredSSID坐标:x=770,y=667
      # 添加等待(有长按)/不添加等待(无长按效果)
      # TouchAction(driver).long_press(x=770,y=667).perform()

手指移动操作
方法:move_to(el=None, x=None, y=None)
  参数:
      1.el:定位的元素
      2.x:相对于前一个元素的X轴偏移量
      3.y:相对于前一个元素的Y轴偏移量
代码实现:
        # 定位到存储
        el = driver.find_element_by_xpath("//*[contains(@text,'存储')]")
        # 定位到更多
        el1 = driver.find_element_by_xpath("//*[contains(@text,'更多')]")
        # 元素方式滑动
        TouchAction(driver).press(el).move_to(el1).release().perform()
        # 坐标的方式滑动
        # TouchAction(driver).press(x=240,y=600).wait(100).move_to(x=240,y=100).release().perform()
        # 注意press连接一个move_to实际调用的是swip方法,可在log中查询,不要给相对坐标。

业务场景2:
        1.进入设置
        2.向上滑动屏幕到可见"安全"选项
        3.进入到安全
        4.点击屏幕锁定方式
        5.点击图案
        6.绘制图案

代码实现:

time.sleep(2)
# 定位到WLAN
el1 = driver.find_element_by_xpath("//*[contains(@text,'WLAN')]")
time.sleep(2)
# 定位到存储
el2 = driver.find_element_by_xpath("//*[contains(@text,'声音')]")
# 存储上滑到WLAN
driver.drag_and_drop(el2,el1)
time.sleep(2)
# 定位到用户
el3 = driver.find_element_by_xpath("//*[contains(@text,'用户')]")
# 注意 这次使用drag_and_drop方法,传入的"存储定位"仍使用其原始在屏幕上的位置,所以是由存储滑动到用户才可以上滑,否则需要重新"定位存储"
# 存储上滑到用户位置
driver.drag_and_drop(el3,el2)
# 点击安全按钮
driver.find_element_by_xpath("//*[contains(@text,'安全')]").click()
time.sleep(2)
# 点击屏幕锁定方式按钮
driver.find_element_by_xpath("//*[contains(@text,'屏幕锁定')]").click()
time.sleep(2)
# 点击图案按钮
driver.find_element_by_xpath("//*[contains(@text,'图案')]").click()
time.sleep(2)
# 绘制图案四个坐标
TouchAction(driver).press(x=654,y=630).wait(100).move_to(x=446,y=847).wait(100).\
    move_to(x=450,y=1047).wait(100).move_to(x=654,y=843).release().perform()

注:尽量每行都加上强制休眠,防止页面在未加载完毕就运行下一行代码,导致报错,然后从第一个滑动的到第二个滑动的时候,第二个滑动的要必须是在刚打开模拟器或者真机设置的时候就能够看见的,然后当第二个滑动到第三个的时候,你可以先把第一个定为设置,也可以在存储上滑倒第三个代码中顺序调换一下,不然会往上滑动。

获取手机时间
方法:device_time
代码实现:
      # 获取当前手机的时间
      print(driver.device_time)

获取手机的宽高
获取手机的宽高,可以根据宽高做一些坐标的操作
方法:get_window_size()
代码实现:
      print(driver.get_window_size())

发送键到设备
模拟系统键值的操作,比如操作honme键,音量键,返回键等。
方法:keyevent(keycode, metastate=None):
  参数:
      keycode:发送给设备的关键代码
      metastate:关于被发送的关键代码的元信息,一般为默认值
代码实现:
      for i in range(3):
          driver.keyevent(24)

操作手机通知栏
打开手机的通知栏,可以获取通知栏的相关信息和元素操作
方法:open_notifications()
代码实现:
      driver.open_notifications()

获取手机当前网络
方法:network_connection
代码实现:
      print(driver.network_connection)

设置手机网络
方法:set_network_connection(connectionType)
参数:
      connectionType:需要被设置成为的网络类型
代码实现:
      driver.set_network_connection(1)    #飞行模式

手机截图
方法:get_screenshot_as_file(filename)
  参数:
      filename:指定路径下,指定格式的图片
代码实现:
      import os
      driver.get_screenshot_as_file(os.getcwd() + os.sep + './screen.png')

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值