表格、恢复出厂、正则

import os
import re
import subprocess
import sys

import uiautomator2 as u2
import time

from pandas.tests.io.excel.test_xlrd import xlrd, xlwt
from xlutils.copy import copy


def set_up():
    d = u2.connect(device)
    time.sleep(1)
    d.screen_on()
    d.shell('input keyevent 82')
    d.shell('input keyevent 3')


def exists(path):
    is_exists = os.path.exists(path)
    if is_exists:
        return True
    else:
        os.mkdir(path)


# 创建结果文件夹
def create_xls(xls_name):
    # 结果文件夹
    exists(os.path.join(os.getcwd(), 'Result'))
    result_dir = os.path.join(os.getcwd(), 'Result')
    # print(result_dir)
    # 判断目标结果excel文件是否存在,若无创建新文件
    result_path = os.path.join(result_dir, xls_name)
    if not os.path.exists(result_path):
        # 创建xls表格
        workbook = xlwt.Workbook(encoding='utf-8')
        # 创建一个worksheet
        worksheet = workbook.add_sheet('result')
        worksheet.col(0).width = 40 * 300  # Set the column width
        worksheet.col(1).width = 40 * 200  # Set the column width
        worksheet.col(2).width = 40 * 200  # Set the column width
        worksheet.col(3).width = 40 * 200  # Set the column width
        # 写入excel
        # 参数对应 行, 列, 值
        worksheet.write(0, 0, 'country')
        worksheet.write(0, 1, 'camera_info')
        worksheet.write(0, 2, 'storage_used')
        worksheet.write(0, 3, 'result')
        # worksheet.write(0, 3, 'rate')
        workbook.save(result_path)
    else:
        pass
    return result_path


def write_excel_xls_append(path, country=[], camera_info=[], storage_used=[], result=[]):
    global worksheet
    workbook = xlrd.open_workbook(path, formatting_info=True)
    try:
        worksheet = workbook.sheet_by_name('result')
    except:
        print('xls文件sheet名称错误,默认名称是result,请检查')
    # 在写入之前需要获取已经写入的行数
    old_nrows = worksheet.nrows
    # print(old_nrows)
    new_workbook = copy(workbook)  # 将xlrd对象拷贝转化为xlwt对象
    new_worksheet = new_workbook.get_sheet(0)  # 获取转化后工作簿中的第一个表格
    # 开始进行写操作
    new_worksheet.write(old_nrows + 1, 0, country)
    new_worksheet.write(old_nrows + 1, 1, camera_info)
    new_worksheet.write(old_nrows + 1, 2, storage_used)
    new_worksheet.write(old_nrows + 1, 3, result)
    new_workbook.save(path)


# 到设置里面的平板信息
def open_to_the_camera():
    for i in range(5):
        d.app_start('com.android.settings')
        time.sleep(1)
        if d(resourceId='android:id/button2').wait(timeout=3):
            d(resourceId='android:id/button2').click()
        time.sleep(4)
        d(scrollable=True).fling.toEnd()
        time.sleep(1)
        d.dump_hierarchy()
        try:
            d.xpath(
                '//*[@resource-id="com.android.settings:id/recycler_view"]/android.widget.LinearLayout['
                '9]/android.widget.ImageView[1]').click()
            time.sleep(1)
            d.xpath(
                '//*[@resource-id="com.android.settings:id/recycler_view"]/android.widget.LinearLayout['
                '1]/android.widget.LinearLayout[1]/android.widget.ImageView[1]').click()
            time.sleep(4)
            d(scrollable=True).fling.toEnd()
            time.sleep(1)
            break
        except:
            print('未能找到设置里面System的xpath,再次执行该操作')
            continue


# 到设置里面的存储界面
def open_to_the_storage():
    os.system('adb -s %s shell input keyevent 82' % device)
    os.system('adb -s %s shell input keyevent 82' % device)
    for i in range(5):
        try:
            d.app_start('com.android.settings')
            time.sleep(4)
            d(scrollable=True).fling.toEnd()
            time.sleep(1)
            d.dump_hierarchy()
            d.xpath(
                '//*[@resource-id="com.android.settings:id/recycler_view"]/android.widget.LinearLayout['
                '7]/android.widget.ImageView[1]').click()
            time.sleep(2)
            break
        except:
            print('未能找到设置里面Storage的xpath,再次执行该操作')
            continue


# 获取camera里面的信息并判断
def camera_text():
    d.dump_hierarchy()
    for i in range(5):
        for j in range(5):
            if not d.xpath('//*[@resource-id="com.android.settings:id/recycler_view"]/android.widget.LinearLayout['
                           '9]/android.widget.RelativeLayout[1]/android.widget.TextView[2]').exists:
                time.sleep(2)
            else:
                break
        try:
            for i in d.xpath(
                    '//*[@resource-id="com.android.settings:id/recycler_view"]/android.widget.LinearLayout['
                    '9]/android.widget.RelativeLayout[1]/android.widget.TextView[2]').all():
                text = i.text
                print(text)
                # 正则表达式 排除里面没有特殊字符+- 只有8和5
                result_1 = re.findall('[\+,\-,=,\*,#,@,!,\$,%,\^,~,\(,\),`]', text)
                if len(result_1) != 0:
                    print('有特殊字符')
                    result = 'False'
                    return text, result
                else:
                    result = re.findall(
                        '([\+,\-,=,\*,#,@,!,\$,%,\^,~,\(,\),\.`,\/]*\d+[\+,\-,=,\*,#,@,!,\$,%,\^,~,\(,\),\.`,\/]*)+',
                        text)
                    print('Camera_text', result)
                    if len(result) != 2:
                        print("数字不是默认的2个数字")
                        result = 'False'
                        return text, result
                    for i in range(len(result)):
                        if '8' != result[i] and '13' != result[i]:
                            # print('Camera_text', result)
                            print("数字不是默认值")
                            result = 'False'
                            return text, result
                        else:
                            result = "True"
                            return text, result
        except:
            print('读取Camera信息失败,再次操作')
            continue


# 获取stroage里面的信息并判断
def storage_text():
    for i in range(5):
        try:
            d.dump_hierarchy()
            for i in range(10):
                if d.xpath('//*[@resource-id="com.android.settings:id/recycler_view"]/android.widget.LinearLayout['
                           '1]/android.widget.LinearLayout[1]/android.widget.TextView[1]').exists:
                    break
                else:
                    time.sleep(2)
            for i in d.xpath(
                    '//*[@resource-id="com.android.settings:id/recycler_view"]/android.widget.LinearLayout['
                    '1]/android.widget.LinearLayout[1]/android.widget.TextView[1]').all():
                text_use = i.text
                print('已经使用', text_use)
            for i in d.xpath(
                    '//*[@resource-id="com.android.settings:id/recycler_view"]/android.widget.LinearLayout['
                    '1]/android.widget.LinearLayout[1]/android.widget.TextView[2]').all():
                text = i.text
                print('内存', text)
                shuzi = re.findall('\d+', str(text))
                # print(shuzi)
                result = ""
                if "64" in shuzi:
                    info = d.xpath(
                        '//*[@resource-id="com.android.settings:id/donut"]').info
                    result_use = info["contentDescription"]
                    print(result_use)
                    # print(result_use)
                    if '31' not in result_use:
                        print('存储空间使用不是默认的值31%')
                        result = "False"
                    else:
                        result = "True"
                elif "128" in shuzi:
                    info = d.xpath(
                        '//*[@resource-id="com.android.settings:id/donut"]').info
                    # print(info)
                    result_use = info["contentDescription"]
                    print(result_use)
                    if '16' not in result_use:
                        print('存储空间使用不是默认的值16%')
                        result = "False"
                    else:
                        result = "True"
                else:
                    info = d.xpath(
                        '//*[@resource-id="com.android.settings:id/donut"]').info
                    info = dict(info)
                    result_use = info["contentDescription"]
                    print(result_use)
                    # 阿拉伯语无法数字判断 默认都false
                    # result_use = re.findall('\w[\%]+', str(info))
                    # result_use = "".join(result_use).encode("gbk", 'ignore').decode("gbk", "ignore")
                    result = "False"
                    # print('阿拉博语言存储空间:', info["contentDescription"])
                    # if '16%' and '31%' not in result_use:
                    #     print(result_use, '存储空间使用不是默认的值16%/31%')
                result_use = ''.join(str(s) for s in result_use)
                return result_use, result
        except:
            print('读取storage信息失败')
            continue


# 进入工厂模式
def enter_factory():
    d = u2.connect(device)
    os.system('adb -s %s shell input keyevent 82' % device)
    os.system('adb -s %s shell input keyevent 82' % device)
    for i in range(5):
        try:
            d.app_start('com.android.settings')
            time.sleep(4)
            d.xpath(
                '//*[@resource-id="android:id/action_bar"]/android.widget.LinearLayout[1]/android.widget.TextView').click()
            time.sleep(2)
            d.send_keys('####6030#')
            for i in range(5):
                if d(text='AE United Arab Emirates').exists:
                    time.sleep(1)
                    break
                else:
                    time.sleep(2)
            break
        except:
            print('进入工厂模式失败')
            continue


# 切换国家码
def change_code_list(start, end):
    d.dump_hierarchy()
    if d(className='android.widget.RadioButton', index=start).exists and d(className='android.widget.RadioButton',
                                                                           index=end).exists:
        d(className='android.widget.RadioButton', index=start).click()
        country = d(className='android.widget.RadioButton', index=start).info["text"]
        time.sleep(1)
        if d(resourceId='com.lenovo.EngineeringCode:id/ok').exists:
            d(resourceId='com.lenovo.EngineeringCode:id/ok').click()
        time.sleep(1)
        if d(resourceId='android:id/button1').wait(timeout=2):
            d(resourceId='android:id/button1').click()
        time.sleep(260)
        for i in range(5):
            try:
                # 等待恢复出厂设置
                os.system("adb -s %s root" % device)
                os.system("adb -s %s remount" % device)
                os.system("adb -s %s shell settings put secure user_setup_complete 1" % device)
                os.system("adb -s %s shell settings put global device_provisioned 1" % device)
                os.system("adb -s %s reboot" % device)
                time.sleep(85)  # 重启
                os.system('adb -s %s shell input keyevent 82' % device)
                os.system('adb -s %s shell input keyevent 82' % device)
                os.system('adb -s %s shell input keyevent 82' % device)
                os.system('adb -s %s shell input keyevent 82' % device)
                os.system('adb -s %s shell settings put system screen_off_timeout 600000' % device)
                os.system('adb -s %s shell settings put system screen_off_timeout 600000' % device)
                os.system('adb -s %s shell input keyevent 3' % device)
                os.system('adb -s %s shell input keyevent 3' % device)
                set_up()
                break
            except:
                print('开机失败重新再次尝试')
                continue
        print(country)
        main()
        try:
            write_excel_xls_append(path=result_path, country=country, camera_info=camera_info,
                                   storage_used=storage_used, result=result)
        except:
            print('请勿在执行过程中打开结果文件')


def main():
    global camera_info, storage_used, result
    open_to_the_camera()
    time.sleep(2)
    result_1 = camera_text()
    time.sleep(2)
    open_to_the_storage()
    time.sleep(4)
    result_2 = storage_text()
    result_3 = result_1 + result_2
    # print(result_3)
    # print(result_3)
    # 结果默认为True 有一个错误即为错
    result = "True"
    for i in range(len(result_3)):
        if "False" in result_3[i]:
            result = "False"
        elif "/" in result_3[i]:
            camera_info = result_3[i]
        elif "%" in result_3[i]:
            storage_used = result_3[i]
    # 排除没有百分比的特殊情况
    if "%" not in result_2:
        storage_used = result_2
        # print(storage_used)
        for m in range(len(storage_used)):
            if storage_used[m] != 'True' and storage_used[m] != 'False':
                storage_used = storage_used[m]
                break
    # 排除没有/ 的情况
    if "/" not in result_1:
        camera_info = result_1
        # print(camera_info)
        for m in range(len(camera_info)):
            if camera_info[m] != 'True' and camera_info[m] != 'False':
                camera_info = camera_info[m]
                # print(camera_info)
                break
    return camera_info, storage_used, result


# 选择设备的id
def device_input():
    device_id = input('请输入需要进行操作的设备id:')
    return device_id


if __name__ == '__main__':
    result_path = create_xls("CheckInDifferentCountry.xls")
    device = device_input()
    d = u2.connect(device)
    time.sleep(1)
    code_1 = 1
    code_2 = 15
    code_3 = 30
    code_4 = 45
    code_5 = 59
    # AR -> EC Ecuador
    for i in range(14):
        enter_factory()
        while True:
            if d(text='AE United Arab Emirates').exists and d(text='EC Ecuador').exists:
                if code_1 < 15:
                    change_code_list(code_1, 15)
                    code_1 += 1
                break
            else:
                os.system('adb -s %s shell input swipe 798 327 781 248' % device)
    print('第一页国家码结束')
    #  EE -> IT Italy
    for i in range(14):
        enter_factory()
        while True:
            if d(text='EC Ecuador').exists and d(text='IT Italy').exists:
                if code_2 < 30:
                    change_code_list(code_2, 30)
                    code_2 += 1
                break
            else:
                os.system('adb -s %s shell input swipe 798 327 781 248' % device)
    print('第二页国家码结束')
    # Japan -> PT Portugal
    for i in range(14):
        enter_factory()
        while True:
            if d(text='IT Italy').exists and d(text='PT Portugal').exists:
                if code_3 < 45:
                    change_code_list(code_3, 45)
                    code_3 += 1
                break
            else:
                os.system('adb -s %s shell input swipe 798 327 781 248' % device)
    print('第三页国家码结束')
    #  RO Romanial-> US United States of America
    for i in range(14):
        enter_factory()
        while True:  # ZA South Africa
            if d(text='PT Portugal').exists and d(text='US United States of America').exists:
                if code_4 < 60:
                    change_code_list(code_4, 60)
                    code_4 += 1
                break
            else:
                os.system('adb -s %s shell input swipe 798 327 781 248' % device)
    # 点击最后二个国家码
    for i in range(2):
        enter_factory()
        while True:
            if d(text='ZA South Africa').exists and d(text='VN Vietnam').exists:
                change_code_list(code_5, 61)
                code_5 += 1
                break
            else:
                os.system('adb -s %s shell input swipe 798 327 781 248' % device)
    # 点击第一个阿拉伯
    enter_factory()
    if d(text='AE United Arab Emirates').exists:
        change_code_list(0, 60)
    print('第四页国家码结束')

 

posted @ 2021-04-01 17:15  是超级可爱的小姚童鞋  阅读(54)  评论(0编辑  收藏  举报