【课程贴】企业微信移动app测试实战 1

课后调查表

参考链接

官网:appium.io
capability 链接地址:

环境安装:Appium 环境搭建( windows 版本 | Mac版本)
相关问题贴:Appium:settings 设置

Appium 框架介绍

  • 推荐 Appium
    • 跨语言:Java、Python、nodejs等
    • 跨平台
      • Andoid、iOS
      • Windows、Mac
    • 底层多引擎可切换
    • 生态丰富,社区强大

Appium 环境

Appium Server

  • Appium Desktop 集成环境,包括Appium Server + Appium Inspector(录制工具)
  • Appium Server (命令行版本) 需要 Nodejs 环境

注意:
Appium 1.5 版本

Appium Client

pip install appium-python-client

Appium Inspector 工具介绍

  • 录制脚本
  • 查找元素

adb 常用命令

  • mac/linux:
adb devices  # 获取连接设备的信息
adb shell  #进入 手机的内环境 
adb logcat  #抓取日志
adb shell dumpsys window|grep mCurrent   #获取当前页面的包名和activity name
adb logcat |grep -i displayed   #获取 app入口packagename 和activityname
adb logcat |grep -i 'activitymanager'   # 也可以获取 app入口的包名和页面名,有的时候使用上面的命令拿不到启动页面的名称,可以使用这个命令
aapt dump badging mobike.apk  | grep launchable-activity   #分析 apk包 获取包名和启动页名
adb install path/to/apk文件 安装apk文件

windows:

  • 将上面的命令中 grep 换成 findstr

企业微信实战1 - 企业微信自动打卡


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 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
# appium-python-client  客户端脚本
from appium import webdriver
from appium.webdriver.common.mobileby import MobileBy

"""
改造1:pytest
"""

class TestWeChat:

    def setup(self):
        caps = {}
        caps["platformName"] = "android"
        caps["deviceName"] = "emulator-5554"
        caps["appPackage"] = "com.tencent.wework"
        caps["appActivity"] = ".launch.LaunchSplashActivity"
        caps["noReset"] = "true"
        caps["noReset"] = "true"
        caps['skipServerInstallation'] = 'true'  # 跳过 uiautomator2 server的安装
        caps['skipDeviceInitialization'] = 'true'    # 跳过设备初始化
        # caps['dontStopAppOnReset'] = 'true'    # 启动之前不停止app
        caps['settings[waitForIdleTimeout]'] = 0

        # 与server 建立连接,初始化一个driver 创建session,返回一个sessionid
        self.driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)
        self.driver.implicitly_wait(10)

    """打卡功能
    """
    def test_daka(self):
        # 步骤1:点击工作台
        # el1 = self.driver.find_element_by_xpath("/hierarchy/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.LinearLayout/android.view.ViewGroup/android.widget.RelativeLayout[3]/android.widget.TextView")
        el1 = self.driver.find_element(MobileBy.XPATH,
                                       "//*[@text='工作台']")
        el1.click()
        # 滚动查找 "打卡" 元素
        self.driver.find_element(
            MobileBy.ANDROID_UIAUTOMATOR,'new UiScrollable'
                                         '(new UiSelector().'
                                         'scrollable(true).'
                                         'instance(0)).'
                                         'scrollIntoView('
                                         'new UiSelector().'
                                         'text("打卡").instance(0));').click()
        # el2 = self.driver.find_element_by_xpath("/hierarchy/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.FrameLayout[2]/android.widget.RelativeLayout/android.view.ViewGroup/android.support.v7.widget.RecyclerView/android.widget.RelativeLayout[10]/android.widget.LinearLayout/android.widget.TextView")
        # el3 = self.driver.find_element_by_id("com.tencent.wework:id/gcx")
        # 点击"外出打卡"
        el3 = self.driver.find_element(MobileBy.ID, "com.tencent.wework:id/gcx")
        el3.click()

        # 点击 第N次外出打卡
        self.driver.find_element(MobileBy.XPATH,
                                 "//*[contains(@text, '次外出')]").click()

        # 验证打卡成功
        result = self.driver.find_element(MobileBy.ID,
                                 'com.tencent.wework:id/mk').text
        assert '打卡成功' in result

    def teardown(self):
        # 消毁session
        self.driver.quit()

思考题:

  • 是否在每个测试步骤都需要加上断言?

1、测试用例编写过程中的中间步骤,执行过程当中一般不需要加断言,除非中间操作过程当中要加入一些数据的验证,toast验证,等等。
2、最后的一行代码,要加入断言作为验证这条用例的真正结果。

PPT

课后作业

1 Like

可以搞个企业微信,我们搞嘛,公司就是使用企业微信的,没有邀请权限啊

用手机号自己注册一个企业微信,我演示就是用的自己注册的新的企业微信,自己是管理员。
实在不行我可以邀请你进我的企业微信

用手机号自己注册一个企业微信,我演示就是用的自己注册的新的企业微信,自己是管理员。
实在不行我可以邀请你进我的企业微信

这个可以有

恩,自己找个手机号,随便就能创建一个企业帐号

#!/usr/bin/env python
# -*- coding: utf-8 -*-
___author___ = 'Steven Emerson'
___date___ = '2020/7/28 7:53'

# 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
# appium-python-client  客户端脚本
import pytest
import time
from appium import webdriver
from appium.webdriver.common.mobileby import MobileBy

"""
改造1:pytest
"""


class TestWeChat:

    # def setup(self):
    def setup_class(self):
        caps = {}
        caps["platformName"] = "android"
        caps["deviceName"] = "127.0.0.1:7555"
        caps["appPackage"] = "com.tencent.wework"
        caps["appActivity"] = ".launch.LaunchSplashActivity"
        caps["noReset"] = "true"
        caps['skipServerInstallation'] = 'true'  # 跳过 uiautomator2 server的安装
        caps['skipDeviceInitialization'] = 'true'  # 跳过设备初始化
        # caps['dontStopAppOnReset'] = 'true'    # 启动之前不停止app
        caps['settings[waitForIdleTimeout]'] = 0
        # 与server 建立连接,初始化一个driver 创建session,返回一个sessionid
        self.driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)
        self.driver.implicitly_wait(10)

    @pytest.mark.skip
    def test_01_daka(self):
        """打卡功能
        """
        # 步骤1:点击工作台
        el1 = self.driver.find_element(MobileBy.XPATH,
                                       "//*[@text='工作台']")
        el1.click()
        # 滚动查找 "打卡" 元素
        self.driver.find_element(
            MobileBy.ANDROID_UIAUTOMATOR, 'new UiScrollable'
                                          '(new UiSelector().'
                                          'scrollable(true).'
                                          'instance(0)).'
                                          'scrollIntoView('
                                          'new UiSelector().'
                                          'text("打卡").instance(0));').click()
        # el3 = self.driver.find_element_by_id("com.tencent.wework:id/gcx")
        # 点击"外出打卡"
        el3 = self.driver.find_element(MobileBy.ID, "com.tencent.wework:id/h58")
        el3.click()
        # 点击 第N次外出打卡
        self.driver.find_element(MobileBy.XPATH, "//*[contains(@text, '次外出')]").click()
        # 验证打卡成功
        result = self.driver.find_element(MobileBy.ID, "com.tencent.wework:id/o_").text
        assert '打卡成功' in result

    def test_02_del_man(self):
        """
        删除账号
        """
        self.driver.find_element(MobileBy.XPATH, "//*[contains(@text,'通讯录')]").click()
        self.driver.find_element(MobileBy.ID, "com.tencent.wework:id/hi7").click()
        self.driver.find_element(MobileBy.XPATH, "//*[contains(@text,'云潇潇')]").click()
        self.driver.find_element(MobileBy.ID, "com.tencent.wework:id/e8u").click() #删除按钮
        self.driver.find_element(MobileBy.ID,"com.tencent.wework:id/ber").click() # 确认按钮

    def test_03_add_man(self):
        """
        添加成员
        """
        self.driver.find_element(MobileBy.XPATH, "//*[contains(@text, '通讯录')]").click()
        self.driver.find_element(MobileBy.XPATH, "//*[contains(@text,'添加成员')]").click()
        self.driver.find_element(MobileBy.XPATH, "//*[contains(@text,'手动输入添加')]").click()
        self.driver.find_element(MobileBy.XPATH, "//*[contains(@text,'必填')]").send_keys("云潇潇")
        self.driver.find_element(MobileBy.XPATH, "//*[contains(@text,'手机号')]").send_keys("15915766619")
        self.driver.find_element(MobileBy.XPATH, "//*[contains(@text,'设置部门')]").click()
        self.driver.find_element(MobileBy.XPATH, "//*[contains(@text,'确定')]").click()
        self.driver.find_element(MobileBy.ID, "com.tencent.wework:id/hi9").click()  # 保存按钮
        time.sleep(1.5)
        self.driver.find_element(MobileBy.ID, "com.tencent.wework:id/hhr").click()
        time.sleep(0.5)
        result = self.driver.find_element(MobileBy.XPATH, "//*[contains(@text,'人未加入')]").text
        assert '人未加入' in result

    # def teardown(self):
    def teardown_class(self):
        # 消毁session
        self.driver.quit()

关闭