20230521-App自动化训练营

PPT

Faker用法

>>> from faker import Faker
>>> fake = Faker("zh_CN")
>>> fake.name()
'张杰'
>>> fake.name()
'杨柳'
>>> fake.name()
'盘秀华'
>>> fake.name()
'亢桂芳'
>>> fake.name()
'陈荣'
>>> fake.name()
'黄慧'
>>> fake.phone_number()
'18946539134'
>>> fake.phone_number()
'18959763610'
>>> fake.phone_number()
'15198913652'
>>> fake.phone_number()
'18202670223'
>>> fake.phone_number()
'18010752856'
>>> 

学习路线总结

appium 学习路线.xmind.zip (252.4 KB)

打开指针位置

  • 设置页面 -找到关于- 找到版本号,连点七下,返回到设置页面
  • 进入开发者选项,找到 指针位置,打开

课堂实战

  • 前提条件:
    • 1、提前注册企业微信管理员帐号
    • 2、手机端安装企业微信
    • 3、企业微信 app 处于登录状态
  • 通讯录添加成员用例步骤
    • 打开【企业微信】应用
    • 进入【通讯录】页面
    • 点击【添加成员】
    • 点击【手动输入添加】
    • 输入【姓名】【手机号】并点击【保存】
  • 验证点:登录成功提示信息
test_contact.py
from time import sleep

from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy
from faker import Faker
from selenium.common import NoSuchElementException


class TestContact():

    def setup_class(self):
        # mock随机数据,姓名,地址,手机号
        self.faker = Faker("zh_CN")
        # 准备资源
        # 定义一个字典
        caps = {}
        # 被测手机的平台
        caps["platformName"] = "Android"
        caps["deviceName"] = "127.0.0.1:11509"
        # 包名和activity名称
        # adb logcat ActivityManager:I | findstr "cmp"
        # adb logcat ActivityManager:I | grep "cmp"
        caps["appPackage"] = "com.tencent.wework"
        caps["appActivity"] = ".launch.LaunchSplashActivity"
        # 防止清空缓存
        caps["noReset"] = "true"
        # 初始化driver
        self.driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", caps)
        # 隐士等待
        self.driver.implicitly_wait(10)

    def teardown_class(self):
        # 销毁资源
        self.driver.quit()

    def test_addcontact(self):
        # 进入【通讯录】页面
        self.driver.find_element(AppiumBy.XPATH, "//*[@text='通讯录']").click()
        # 点击【添加成员】
        self.swip_find("添加成员").click()
        # 点击【手动输入添加】
        self.driver.find_element(AppiumBy.XPATH, "//*[@text='手动输入添加']").click()
        # 输入【姓名】【手机号】
        self.driver.find_element(AppiumBy.XPATH, "//*[@text='姓名 ']/../*[@text='必填']").send_keys(self.faker.name())
        self.driver.find_element(AppiumBy.XPATH, "//*[@text='手机 ']/..//*[@text='必填']").send_keys(self.faker.phone_number())
        # 点击【保存】
        self.driver.find_element(AppiumBy.XPATH, "//*[@text='保存']").click()
        # 打印page_source 找到toast提示
        # sleep(2)
        # print(self.driver.page_source)
        toast_tips = self.driver.find_element(AppiumBy.XPATH, "//*[@class='android.widget.Toast']").text
        # 验证结果
        assert toast_tips == "添加成功"

    def swip_find(self, text, max_num=5):
        self.driver.implicitly_wait(1)
        # 滑动查找
        for num in range(max_num):
            try:
                element = self.driver.find_element(AppiumBy.XPATH, f"//*[@text='{text}']")
                sleep(1)
                return element
            except NoSuchElementException as e:
                print("未找到元素")
                # 获取屏幕大小
                size = self.driver.get_window_size()
                width = size.get("width")
                height = size.get("height")

                start_x = width / 2
                start_y = height * 0.8

                end_x = width / 2
                end_y = height * 0.2

                self.driver.swipe(start_x, start_y, end_x, end_y, 2000)
            if num == max_num - 1:
                self.driver.implicitly_wait(10)
                # 执行最大次数,仍然没有找到文本,抛异常
                raise NoSuchElementException(f"找了{num}次,还是没有找到,请确认当前页面是否存在")

练习

企业微信实战(打卡功能)

  • 前提条件:
    • 1、提前注册企业微信管理员帐号
    • 2、手机端安装企业微信
    • 3、企业微信 app 处于登录状态
  • 实现打卡功能
    • 打开【企业微信】应用
    • 进入【工作台】页面
    • 点击【打卡】
    • 选择【外出打卡】tab
    • 点击【第 N 次打卡】
  • 验证点:提示【外出打卡成功】
# test_workbench.py
"""
__author__ = '霍格沃兹测试开发学社'
__desc__ = '更多测试开发技术探讨,请访问:https://ceshiren.com/t/topic/15860'
"""
from time import sleep

from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy
from selenium.common import NoSuchElementException


class TestWorkBench:

    def setup_class(self):
        # 准备资源
        # 定义一个字典
        caps = {}
        # 被测手机的平台
        caps["platformName"] = "Android"
        caps["deviceName"] = "127.0.0.1:11509"
        # 包名和activity名称
        # adb logcat ActivityManager:I | findstr "cmp"
        # adb logcat ActivityManager:I | grep "cmp"
        caps["appPackage"] = "com.tencent.wework"
        caps["appActivity"] = ".launch.LaunchSplashActivity"
        # 防止清空缓存
        caps["noReset"] = "true"
        # 初始化driver
        self.driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", caps)
        # 隐士等待
        self.driver.implicitly_wait(10)

    def teardown_class(self):
        # 销毁资源
        self.driver.quit()

    def test_clockin(self):
        # 进入【工作台】页面
        self.driver.find_element(AppiumBy.XPATH, "//*[@text='工作台']").click()
        # 点击【打卡】
        self.swip_find("打卡").click()
        # 选择【外出打卡】tab
        self.driver.find_element(AppiumBy.XPATH, "//*[@text='外出打卡']").click()
        # 点击【第N次打卡】
        self.driver.find_element(AppiumBy.XPATH, "//*[contains(@text, '次外出')]").click()
        # 验证 外出打卡成功
        text = self.driver.find_element(AppiumBy.XPATH, "//*[contains(@text, '外出打卡成功')]").text
        assert "外出打卡成功" == text

    def swip_find(self, text, max_num=5):
        self.driver.implicitly_wait(1)
        # 滑动查找
        for num in range(max_num):
            try:
                element = self.driver.find_element(AppiumBy.XPATH, f"//*[@text='{text}']")
                sleep(1)
                return element
            except NoSuchElementException as e:
                print("未找到元素")
                # 获取屏幕大小
                size = self.driver.get_window_size()
                width = size.get("width")
                height = size.get("height")

                start_x = width / 2
                start_y = height * 0.8

                end_x = width / 2
                end_y = height * 0.2

                self.driver.swipe(start_x, start_y, end_x, end_y, 2000)
            if num == max_num - 1:
                self.driver.implicitly_wait(10)
                # 执行最大次数,仍然没有找到文本,抛异常
                raise NoSuchElementException(f"找了{num}次,还是没有找到,请确认当前页面是否存在")

第一次定位打卡,定位弹窗提示的处理