菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
417
0

常用Appium API

原创
05/13 14:22
阅读数 80758


?以最右App为例

.apk文件网盘地址:

链接:https://pan.baidu.com/s/1L4MYkhpb5ECe8XeaneTx_Q
提取码:0jqm

操作类API

# -*- coding:utf-8 -*-
# 作者:IT小学生蔡坨坨
# 时间:2020/12/22 21:05

import unittest
import time
from appium import webdriver


class AndroidTests(unittest.TestCase):
    def setUp(self):
        desired_caps = {}
        desired_caps['platformName'] = 'Android'
        desired_caps['platformVersion'] = '10'
        desired_caps['deviceName'] = 'Android Emulator'
        desired_caps['noReset'] = 'True'
        desired_caps['appPackage'] = 'cn.xiaochuankeji.tieba'
        desired_caps['appActivity'] = '.ui.base.SplashActivity'

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

    def tearDown(self):
        print("执行结束!")

    def test_operate_api(self):
        self.driver.implicitly_wait(60)
        time.sleep(8)

        # 控件点击:click()
        # 场景:点击关注按钮
        ele = self.driver.find_element_by_id("cn.xiaochuankeji.tieba:id/title")
        ele.click()
        time.sleep(2)

        # 点击搜索按钮
        self.driver.find_element_by_id("cn.xiaochuankeji.tieba:id/ic_search_b").click()
        time.sleep(3)
        # 点击搜索输入框
        ele_input = self.driver.find_element_by_id("cn.xiaochuankeji.tieba:id/search_input")
        ele_input.click()
        # 控件输入
        ele_input.send_keys("123456")
        time.sleep(2)
        print(ele_input.text)
        ele_input.clear()
        time.sleep(2)

        # 获取手机分辨率
        height = self.driver.get_window_size()["height"]
        width = self.driver.get_window_size()["width"]
        print("手机分辨率是:" + str(height) + "*" + str(width))


if __name__ == '__main__':
    suite = unittest.TestLoader().loadTestsFromTestCase(AndroidTests)
    unittest.TextTestRunner(verbosity=2).run(suite)

?️属性获取

# -*- coding:utf-8 -*-
# 作者:IT小学生蔡坨坨
# 时间:2020/12/22 21:05

import unittest
import time
from appium import webdriver


class AndroidTests(unittest.TestCase):
    def setUp(self):
        desired_caps = {}
        desired_caps['platformName'] = 'Android'
        desired_caps['platformVersion'] = '10'
        desired_caps['deviceName'] = 'Android Emulator'
        desired_caps['noReset'] = 'True'
        desired_caps['appPackage'] = 'cn.xiaochuankeji.tieba'
        desired_caps['appActivity'] = '.ui.base.SplashActivity'

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

    def tearDown(self):
        print("执行结束!")

    def test_attribute(self):
        self.driver.implicitly_wait(60)
        time.sleep(8)

        # 获取当前活动页面
        current_activity = self.driver.current_activity
        print(current_activity)

        # 定位搜索按钮,赋值给ele_search
        ele_search = self.driver.find_element_by_id("cn.xiaochuankeji.tieba:id/ic_search_b")

        # 获取控件的属性值
        # 获取控件的className
        print(ele_search.get_attribute("className"))
        # 获取控件的resourceId
        print(ele_search.get_attribute("resourceId"))

        # 判断控件是否显示
        print(ele_search.is_displayed())
        # 判断控件是否可用
        print(ele_search.is_enabled())

        """
        .ui.home.page.PageMainActivity
        android.widget.ImageView
        cn.xiaochuankeji.tieba:id/ic_search_b
        True
        True
        执行结束!
        """


if __name__ == '__main__':
    suite = unittest.TestLoader().loadTestsFromTestCase(AndroidTests)
    unittest.TextTestRunner(verbosity=2).run(suite)

?swipe

# -*- coding:utf-8 -*-
# 作者:IT小学生蔡坨坨
# 时间:2020/12/22 21:05

import unittest
import time
from appium import webdriver


class AndroidTests(unittest.TestCase):
    def setUp(self):
        desired_caps = {}
        desired_caps['platformName'] = 'Android'
        desired_caps['platformVersion'] = '10'
        desired_caps['deviceName'] = 'Android Emulator'
        desired_caps['noReset'] = 'True'
        desired_caps['appPackage'] = 'cn.xiaochuankeji.tieba'
        desired_caps['appActivity'] = '.ui.base.SplashActivity'

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

    def tearDown(self):
        print("执行结束!")

    def test_swipe(self):
        self.driver.implicitly_wait(60)
        time.sleep(8)

        self.driver.swipe(500, 1000, 500, 2000)  # 手势下拉
        time.sleep(3)
        self.driver.swipe(500, 2000, 500, 1000)  # 手势上滑
        time.sleep(3)
        self.driver.swipe(500, 2000, 500, 2000, 100)  # 点击
        time.sleep(3)
        self.driver.swipe(500, 2000, 500, 2000, 3000)  # 长按
        time.sleep(3)

        # 获取手机分辨率
        height = self.driver.get_window_size()["height"]
        width = self.driver.get_window_size()["width"]
        print("手机分辨率是:" + str(height) + "*" + str(width))
        # 按照手机分辨率定位
        self.driver.swipe(width * 0.463, height * 0.448, width * 0.463, height * 0.896, 100)


if __name__ == '__main__':
    suite = unittest.TestLoader().loadTestsFromTestCase(AndroidTests)
    unittest.TextTestRunner(verbosity=2).run(suite)

?TouchAction

# -*- coding:utf-8 -*-
# 作者:IT小学生蔡坨坨
# 时间:2020/12/22 19:26

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


class AndroidTests(unittest.TestCase):
    def setUp(self):
        desired_caps = {}
        desired_caps['platformName'] = 'Android'
        desired_caps['platformVersion'] = '10'
        desired_caps['deviceName'] = 'Android Emulator'
        desired_caps['noReset'] = 'True'
        desired_caps['appPackage'] = 'cn.xiaochuankeji.tieba'
        desired_caps['appActivity'] = '.ui.base.SplashActivity'

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

    def tearDown(self):
        print("执行结束!")

    def test_touch_action(self):
        self.driver.implicitly_wait(60)
        time.sleep(8)

        # 点击控件
        # 点击搜索控件
        ele = self.driver.find_element_by_id("cn.xiaochuankeji.tieba:id/ic_search_b")
        TouchAction(self.driver).tap(ele).perform()
        time.sleep(3)

        # 坐标点击
        # 点击坐标(150,150)
        # 点击搜索框,出现键盘
        TouchAction(self.driver).tap(x=150, y=150).perform()
        time.sleep(2)

        # 按压某个点
        # 按压搜索框以外的空白处,键盘消失
        TouchAction(self.driver).press(x=150, y=1040).release().perform()
        time.sleep(2)

        # 返回到推荐页面
        self.driver.keyevent(4)
        time.sleep(3)

        # 长按某个点
        # 长按第一条帖子
        TouchAction(self.driver).long_press(x=500, y=600).release().perform()
        time.sleep(2)

        TouchAction(self.driver).press(x=500, y=600).release().perform()
        time.sleep(2)

        # 长按控件
        # 长按第一条帖子
        ele = self.driver.find_element_by_id("cn.xiaochuankeji.tieba:id/holder_flow_rmdv")
        TouchAction(self.driver).long_press(ele).perform()

⌨️keyevent

Android KEYCODE键值对:

参考地址:https://blog.csdn.net/shililang/article/details/14449527

# -*- coding:utf-8 -*-
# 作者:IT小学生蔡坨坨
# 时间:2020/12/22 19:26

import unittest
import time
from appium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


class AndroidTests(unittest.TestCase):
    def setUp(self):
        desired_caps = {}
        desired_caps['platformName'] = 'Android'
        desired_caps['platformVersion'] = '10'
        desired_caps['deviceName'] = 'Android Emulator'
        desired_caps['noReset'] = 'True'
        desired_caps['appPackage'] = 'cn.xiaochuankeji.tieba'
        desired_caps['appActivity'] = '.ui.base.SplashActivity'

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

    def tearDown(self):
        print("执行结束!")

    def test_key_event(self):
        time.sleep(8)
        # 返回键
        self.driver.keyevent(4)
        self.driver.implicitly_wait(5)
        # toast提示框
        ele = WebDriverWait(self.driver, 20, 0.1).until(
            EC.presence_of_element_located((By.XPATH, './/*[contains(@text,"再按一次返回键")]')))
        print(ele.text)
        # 再按一次返回键,退出程序
        self.driver.keyevent(4)

        """
        KEYCODE_MENU 菜单键82
        KEYCODE_BACK 返回键4
        KEYCODE_SEARCH 搜索键84
        KEYCODE_ENTER 回车键66
        KEYCODE_DEL 退格键67
        KEYCODE_FORWARD_DEL 删除键112
        ......
        """

?截图

# -*- coding:utf-8 -*-
# 作者:IT小学生蔡坨坨
# 时间:2020/12/22 19:18

import unittest
import time
from appium import webdriver


class AndroidTests(unittest.TestCase):
    def setUp(self):
        desired_caps = {}
        desired_caps['platformName'] = 'Android'
        desired_caps['platformVersion'] = '10'
        desired_caps['deviceName'] = 'Android Emulator'
        desired_caps['noReset'] = 'True'
        desired_caps['appPackage'] = 'cn.xiaochuankeji.tieba'
        desired_caps['appActivity'] = '.ui.base.SplashActivity'

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

    def tearDown(self):
        print("执行结束!")

    def test_screen_shot(self):
        self.driver.implicitly_wait(60)

        # 场景:点击关注按钮,切换至关注页面,截图
        ele = self.driver.find_element_by_id("cn.xiaochuankeji.tieba:id/title")
        ele.click()
        time.sleep(2)
        self.driver.get_screenshot_as_file(r"D:\Desktop\Testman_Study\图库\screen\test.png")


if __name__ == '__main__':
    suite = unittest.TestLoader().loadTestsFromTestCase(AndroidTests)
    unittest.TextTestRunner(verbosity=2).run(suite)

??中文输入法

# -*- coding:utf-8 -*-
# 作者:IT小学生蔡坨坨
# 时间:2020/12/22 18:44

import unittest
import time
from appium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait


class AndroidTest(unittest.TestCase):
    def setUp(self):
        desired_caps = {}
        desired_caps["platformName"] = "Android"
        desired_caps["platformVersion"] = "10"
        desired_caps['deviceName'] = 'Android Emulator'
        desired_caps['noReset'] = 'True'
        desired_caps['appPackage'] = 'cn.xiaochuankeji.tieba'
        desired_caps['appActivity'] = '.ui.base.SplashActivity'

        # 输入中文
        desired_caps['unicodeKeyboard'] = 'True'  # 安装appium自带输入法
        desired_caps['resetKeyboard'] = 'True'  # 重置键盘,修改默认输入法

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

    def tearDown(self):
        print("执行完成!")

    def test_chinese(self):
        time.sleep(8)
        # 点击第一条帖子的评论按钮
        el = self.driver.find_element_by_id("cn.xiaochuankeji.tieba:id/middle_view").click()
        time.sleep(5)
        # 点击评论输入框
        self.driver.find_element_by_id("cn.xiaochuankeji.tieba:id/etInput").click()
        time.sleep(4)
        # 输入评论内容12346
        self.driver.find_element_by_id("cn.xiaochuankeji.tieba:id/etInput").send_keys('真不错!')
        time.sleep(2)
        # 点击发送
        self.driver.find_element_by_id("cn.xiaochuankeji.tieba:id/send").click()
        # 通过xpath,text属性定位toast提示框
        # toast_loc = ("xpath", './/*[contains(@text,"评论发送成功")]')
        # 显式等待
        ele = WebDriverWait(self.driver, 20, 0.1).until(
            expected_conditions.presence_of_element_located((By.XPATH, './/*[contains(@text,"评论发送成功")]')))
        # 输出toast提示框的文本内容
        print(ele.text)
        time.sleep(2)
        self.driver.keyevent(4)

⛑️重置App

# -*- coding:utf-8 -*-
# 作者:IT小学生蔡坨坨
# 时间:2020/12/22 19:06

import os
import unittest
from appium import webdriver

PATH = lambda p: os.path.abspath(
    os.path.join(os.path.dirname(__file__), p)
)


class AndroidTest(unittest.TestCase):
    def setUp(self):
        desired_caps = {}
        desired_caps["platformName"] = "Android"
        desired_caps["platformVersion"] = "10"
        desired_caps['deviceName'] = 'Android Emulator'

        # 重置app
        desired_caps['fullReset'] = "true"
        # .apk文件的路径
        desired_caps['app'] = r"D:\Desktop\Testman_Study\apk\zuiyou518.apk"
        # desired_caps['app'] = PATH("D:\Desktop\Testman_Study\apk\zuiyou518.apk")

        desired_caps['appPackage'] = 'cn.xiaochuankeji.tieba'
        desired_caps['appActivity'] = '.ui.base.SplashActivity'

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

    def tearDown(self):
        print("执行完成!")

    def test_resetApp(self):
        pass

⚗️toast

import os
import unittest
import time
from appium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By


class AndroidTests(unittest.TestCase):
    def setUp(self):
        desired_caps = {}
        desired_caps['platformName'] = 'Android'
        desired_caps['platformVersion'] = '10'
        desired_caps['deviceName'] = 'Android Emulator'
        desired_caps['noReset'] = 'True'
        desired_caps['appPackage'] = 'cn.xiaochuankeji.tieba'
        desired_caps['appActivity'] = '.ui.base.SplashActivity'
        # Appium1.6.3版本后才支持toast,之前封装的是Uiautomator,之后才是Uiautomator2
        desired_caps['automationName'] = 'Uiautomator2'
        desired_caps['newCommandTimeout'] = 200

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

    def tearDown(self):
        # self.driver.quit()
        print("执行结束!")

    def test_toast(self):
        """
        toast:
        Android中的Toast是一种简易的消息提示框;
        告知用户任务状态,操作结果,例如:发送成功,加载中,删除成功;
        Toast会在屏幕所有层的最上方;
        显示时间有限,1s+左右消失。

        场景:评论帖子->点击发送->提示评论发送成功的灰黑框->1-2s后消失
        """
        # self.driver.implicitly_wait(160)
        time.sleep(8)
        # 点击第一条帖子的评论按钮
        el = self.driver.find_element_by_id("cn.xiaochuankeji.tieba:id/middle_view").click()
        time.sleep(5)
        # 点击评论输入框
        self.driver.find_element_by_id("cn.xiaochuankeji.tieba:id/etInput").click()
        time.sleep(4)
        # 输入评论内容12346
        self.driver.find_element_by_id("cn.xiaochuankeji.tieba:id/etInput").send_keys('123456')
        time.sleep(2)
        # 点击发送
        self.driver.find_element_by_id("cn.xiaochuankeji.tieba:id/send").click()
        # 通过xpath,text属性定位toast提示框
        # toast_loc = ("xpath", './/*[contains(@text,"评论发送成功")]')
        # 显式等待
        ele = WebDriverWait(self.driver, 20, 0.1).until(
            EC.presence_of_element_located((By.XPATH, './/*[contains(@text,"评论发送成功")]')))
        # 输出toast提示框的文本内容
        print(ele.text)
        time.sleep(2)
        self.driver.keyevent(4)

发表评论

0/200
417 点赞
0 评论
收藏
为你推荐 换一批