Android安卓-泛微OA Emobile7自动打卡

Android安卓-泛微OA Emobile7自动打卡

  • Emobile 公司使用背景
  • UI自动化环境搭建
  • adb常用命令
    • 查询当前设备
    • 多个设备之间切换
    • 查询包名启动名
  • UI自动化appium代码
    • 基本配置
    • 当你第一次登陆成功后没有退出,且遇到更新,自动取消更新
    • 如果遇到没有权限,就设置允许权限
    • 首先设置一个服务地址和登录信息
    • 登录后进入工作台
    • 进入打卡页面,获取位置权限
    • UI自动化如何执行起来
    • emobile7 部分截图

Emobile 公司使用背景

因为也有不少公司买了这个OA系统,然后一开始都是被吐槽的,超级难用啊!

特别IOS系统的水果机,打卡打1~2分钟,而且不支持高并发的那种,一打就迟到的那种

很久一段时间没有写过,UI自动化了,有兴趣的同学可以玩一下

本次教程使用Python + appium + 一台安卓真机,先简单的面向过程,达到一种简单就可以实现功能的代码这种 肯定low 后面再优化

UI自动化环境搭建

这里说的就是,整个过程只需要,运行Python代码就可以执行,自动打卡即可

  • Java 环境(JDK)
  • Android SDK
  • Android SDK Manager 的配置与使用
  • 模拟器安装 或者 使用真机
  • Appium 客户端
  • Appium 框架包
    如果还没有安装好的可以看看,之前的教程,传送连接

adb常用命令

查询当前设备

adb devices -l

多个设备之间切换

# -s 后面跟的就是 指定设备名称
adb -s 设备名称 shell dumpsys activity | findstr "mFocusedActivity"

查询包名启动名

# 查询包名启动名
adb shell dumpsys activity | findstr "mFocusedActivity"
# 或者
adb shell dumpsys activity activities

UI自动化appium代码

基本配置

导入需要的包

import time

from appium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

设置appium的基本参数capabilities

  • appPackage:包名
  • appActivity:启动名
    我用的是华为真机,如果是其他机型可能会有说不同,建议通过adb命令去获取,当前打开的应该程序名称为准
# "noReset": True 
# 这个设置的意思是,不对APP进行初始设置

capabilities = {
    "platformName": "Android",
    "platformVersion": "10.0.0",
    "deviceName": "设备名称",
    "appPackage": "com.weaver.emobile7",
    "appActivity": "weaver.fw.com.WelcomeActivity",
    "noReset": True
}

driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_capabilities=capabilities)


# 获取当前屏幕大小
X = driver.get_window_size()['width']
Y = driver.get_window_size()['height']
time.sleep(2)

当你第一次登陆成功后没有退出,且遇到更新,自动取消更新

# 当你第一次登陆成功后没有退出,且遇到更新,自动取消更新
# for 是为了循环执行3次,等待取消的按钮出现
# 最长等待2秒,每0.5秒检查一次元素,够2秒退出1次循环
# 有找到【取消】按钮就点击一下

# notUpdate
for i in range(3):
    notUpdateBtnE = ("xpath", "//*[@resource-id='com.weaver.emobile7:id/sdl__negative_button']")
    # notUpdateBtnE = ("xpath", "//*[contains(@text,'取消')]")
    try:
        e = WebDriverWait(driver, 2, 0.5).until(EC.presence_of_element_located(notUpdateBtnE))
        e.click()
    except:
        print("没有找到[取消更新]元素")

如果遇到没有权限,就设置允许权限

  • 手机不通提示的权限也不通的,这个是华为的手机
  • ‘始终允许’、‘允许’、‘使用期间允许’,根据机型修改
# phoneAllow
for i in range(3):
    # allowBtnE = ("xpath", "//*[@resource-id='com.android.permissioncontroller:id/permission_allow_button']")
    allowBtnE = ("xpath", "//*[contains(@text,'始终允许')]")
    try:
        e = WebDriverWait(driver, 2, 0.5).until(EC.presence_of_element_located(allowBtnE))
        e.click()
    except:
        print("没有找到[始终允许]元素")

首先设置一个服务地址和登录信息

  • 一开始输入框空白的,所以没有写clear的方法
  • 直接send_keys
# settingAddress
try:
    driver.find_element_by_xpath("//*[@resource-id='com.weaver.emobile7:id/server_edit']").click()
    driver.find_element_by_xpath("//*[@resource-id='com.weaver.emobile7:id/server_edit']").send_keys(
        "你的服务器地址")
    driver.find_element_by_xpath("//*[@resource-id='com.weaver.emobile7:id/btn_login']").click()
except:
    print("没有找到[设置服务器]元素")

try:
    # loginIinformation
    driver.find_element_by_xpath("//*[@resource-id='loginid']").click()
    driver.find_element_by_xpath("//*[@resource-id='loginid']").send_keys("你的账户")

    driver.find_element_by_xpath("//*[@resource-id='userpassword']").click()
    driver.find_element_by_xpath("//*[@resource-id='userpassword']").clear()
    driver.find_element_by_xpath("//*[@resource-id='userpassword']").send_keys("你的密码")
    time.sleep(2)
    driver.find_element_by_xpath("//android.widget.Button[contains(@text,'登 录')]").click()
    except:
    print("没有找到[登录]元素")

登录后进入工作台


try:
    driver.find_element_by_xpath("//*[@resource-id='com.weaver.emobile7:id/address_image']").click()
    time.sleep(3)
except:
    print("没有找到[工作台]元素")

time.sleep(2)
ImageBtn = ("xpath",
            "//*[@resource-id='entrance-page']/android.view.View[1]/android.view.View[1]/android.view.View[1]/android.view.View[11]/android.view.View/android.widget.Image")

Ie = WebDriverWait(driver, 2, 0.5).until(EC.presence_of_element_located(ImageBtn))
Ie.click()

进入打卡页面,获取位置权限

  • 位置权限,上面的设置也是一样的
  • 找到打卡的按钮,点击就可以完成打卡,并退出自动化的驱动
# phoneLocationAllow
for i in range(3):
    allowBtnE = ("xpath", "//*[@resource-id='com.android.permissioncontroller:id/permission_allow_always_button']")
    try:
        e = WebDriverWait(driver, 2, 0.5).until(EC.presence_of_element_located(allowBtnE))
        time.sleep(3)
        e.click()
    except:
        print("没有找到[位置]元素")

time.sleep(3)
try:
    ele = driver.find_element_by_xpath("//*[@text='打卡']")
    ele.click()
    print("ok")
except:
    print("没有找到[打卡]元素")

time.sleep(5)

driver.quit()

UI自动化如何执行起来

  1. python 可以加定时器任务
  2. 远程电脑执行这个代码
  3. 当然是有一台手机一直连接电脑,并且有网络
  4. time.sleep 防止加载慢导致找不到元素
  5. try是因为有些元素不知道什么时候有或者没有

emobile7 部分截图

Android安卓-泛微OA Emobile7自动打卡_第1张图片

Android安卓-UI自动打卡Appium+PO+Pytest(1)

你可能感兴趣的:(测试工程师,#,自动化测试,#,UI自动化,python,linux,安卓,android)