python + uiautomator2编译平板语言工具并切换打包exe可执行文件

初版:

  1. 在命令行输入 adb shell am monitor

2.点击打开要获取包名的应用

3.在命令行则会显示当前启动的应用的包名


设备端需要安装atx-agent

1.进入到对应的sitpackage(uiautomator2所在的地方),在命令行输入 python -m uiautomator2 init,则会自动给设备安装好对应的apk等配置

Microsoft Windows [版本 10.0.18363.1198]
(c) 2019 Microsoft Corporation。保留所有权利。D:\K_Learning\pythonFiles\airtest_script\venv\Lib\site-packages>python -m uiautomator2 init
[I 201118 16:48:37 init:155] uiautomator2 version: 2.12.0
[I 201118 16:48:37 init:352] Install minicap, minitouch
[D 201118 16:48:37 init:62] Download https://tool.appetizer.io/openatx/stf-binaries/raw/0.2.2/node_modules/minitouch-prebuilt-beta/prebuilt/arm64-v8a/bin/minitouch
minitouch |⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿| 34.1 KB/34.1 KB
[?25h[D 201118 16:48:38 init:232] Push to /data/local/tmp/minitouch:0755
[D 201118 16:48:38 init:62] Download https://tool.appetizer.io/openatx/stf-binaries/raw/0.2.2/node_modules/minicap-prebuilt-beta/prebuilt/arm64-v8a/lib/android-29/minicap.so
minicap.so |⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿| 28.4 KB/28.4 KB
[?25h[D 201118 16:48:38 init:232] Push to /data/local/tmp/minicap.so:0755
[D 201118 16:48:38 init:62] Download https://tool.appetizer.io/openatx/stf-binaries/raw/0.2.2/node_modules/minicap-prebuilt-beta/prebuilt/arm64-v8a/bin/minicap
minicap |⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿| 526.5 KB/526.5 KB
[?25h[D 201118 16:48:39 init:232] Push to /data/local/tmp/minicap:0755
[D 201118 16:48:39 init:250] apk-debug package-info: None
[D 201118 16:48:39 init:251] apk-debug-test package-info: None
[I 201118 16:48:39 init:367] Install com.github.uiautomator, com.github.uiautomator.test 2.3.1
[D 201118 16:48:39 init:162] Shell: ('pm', 'uninstall', 'com.github.uiautomator')
[D 201118 16:48:39 init:162] Shell: ('pm', 'uninstall', 'com.github.uiautomator.test')
[D 201118 16:48:39 init:62] Download https://tool.appetizer.io/openatx/android-uiautomator-server/releases/download/2.3.1/app-uiautomator.apk
app-uiautomator.apk |⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿| 2.1 MB/2.1 MB
[?25h[D 201118 16:48:40 init:232] Push to /data/local/tmp/app-uiautomator.apk:0644
[D 201118 16:48:40 init:162] Shell: ('pm', 'install', '-r', '-t', '/data/local/tmp/app-uiautomator.apk')
[I 201118 16:48:47 init:332] - app-uiautomator.apk installed
[D 201118 16:48:47 init:62] Download https://tool.appetizer.io/openatx/android-uiautomator-server/releases/download/2.3.1/app-uiautomator-test.apk
app-uiautomator-test.apk |⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿| 1.2 MB/1.2 MB
[?25h[D 201118 16:48:48 init:232] Push to /data/local/tmp/app-uiautomator-test.apk:0644
[D 201118 16:48:48 init:162] Shell: ('pm', 'install', '-r', '-t', '/data/local/tmp/app-uiautomator-test.apk')
[I 201118 16:48:49 init:332] - app-uiautomator-test.apk installed
[I 201118 16:48:49 init:340] Install atx-agent 0.9.5
[D 201118 16:48:49 init:62] Download https://tool.appetizer.io/openatx/atx-agent/releases/download/0.9.5/atx-agent_0.9.5_linux_armv7.tar.gz
atx-agent_0.9.5_linux_armv7.tar.gz |⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿| 4.1 MB/4.1 MB
[?25h[D 201118 16:48:49 init:232] Push to /data/local/tmp/atx-agent:0755
[D 201118 16:48:50 init:162] Shell: ('/data/local/tmp/atx-agent', 'server', '--stop')
[D 201118 16:48:51 init:162] Shell: ('/data/local/tmp/atx-agent', 'server', '--nouia', '-d')
[D 201118 16:48:51 init:162] Shell: ('/data/local/tmp/atx-agent', 'server', '--nouia', '-d')
[I 201118 16:48:51 init:377] Check atx-agent version
[D 201118 16:48:51 init:390] Forward: local:tcp:53075 -> remote:tcp:7912
[D 201118 16:48:52 init:390] Forward: local:tcp:53075 -> remote:tcp:7912
[D 201118 16:48:52 init:390] Forward: local:tcp:53075 -> remote:tcp:7912
[D 201118 16:48:52 init:393] atx-agent version 0.9.5
Successfully init AdbDevice(serial=HA12G0GW)
  1. 下载所push到的都在设备的 /data/local/tmp(所有的东西都在设备的这个文件夹里面),可以通过adb shell 进入这个文件夹查看

  2. 把这些东西拉到电脑上

    D:\G_Working\自动化小工具需求\语言切换判断\截图\设备所需安装apk和文件>adb pull /data/local/tmp
    /data/local/tmp/: 7 files pulled, 0 skipped. 10.0 MB/s (14026373 bytes in 1.334s)
    

4.根据cmd命令显示可以看出,它的操作步骤是在下载文件,安装文件,给ATX授权等操作

直接封装成bat命令

:: 预置文件
adb push ./tmp/dalvik-cache /data/local/tmp
adb push ./tmp/minicap  /data/local/tmp
adb push ./tmp/minicap.so  /data/local/tmp
adb push ./tmp/minitouch  /data/local/tmp
adb push ./tmp/uidump.xml  /data/local/tmp
adb push ./tmp/app-uiautomator.apk  /data/local/tmp
adb push ./tmp/app-uiautomator-test.apk  /data/local/tmp
adb push ./tmp/atx-agent  /data/local/tmp
adb install ./tmp/app-uiautomator.apk
adb install ./tmp/app-uiautomator-test.apk
adb shell /data/local/tmp/atx-agent server --stop
adb shell chmod 775 /data/local/tmp/atx-agent   #给atx-agent授权
adb shell /data/local/tmp/atx-agent server --nouia -d #添加-d表示在后台启动tx-agent

该工具网盘链接:

链接:https://pan.baidu.com/s/1xLlHzTev1uSEL11avLKJog
提取码:xznb
复制这段内容后打开百度网盘手机App,操作更方便哦
import uiautomator2
import time
import uiautomator2 as u2
#连接手机
print("正在连接设备")
d = u2.connect(r"HA169RPZ")   #HA12FYBL\HA12G0GW\HA169RPZ填入设备的SN号即可print("设备连接成功,先回到主页面")
d.press('home')
print("回到主页面成功,正在启动应用")
d.implicitly_wait(20)
#启动应用
d.app_start("com.android.settings")
print("应用启动成功")
#创建session连接对象,建议与设置应用的绑定连接
s = d.session('com.android.settings',attach=True)
time.sleep(3)
#获取设备的尺寸
print(d.window_size())
sizeTuple = d.window_size()
x = sizeTuple[0]
y = sizeTuple[1]
print("屏幕的宽为:"+str(x) +",屏幕的高为:"+str(y)) #获取屏幕的宽高
#1.进入设置之后,划动屏幕找到System
d.swipe(x/5 * 4,y/5 * 4,x/5*4,y/5*1,1,50)
d.swipe(x/5 * 4,y/5 * 4,x/5*4,y/5*1,1,50)
d.implicitly_wait(5)
#2.通过class和下标点击系统(开发者模式)
d(className = 'android.widget.LinearLayout',index = '18').click()
time.sleep(1)
#3.点击语言和输入法
d(className = 'android.widget.LinearLayout',index = '1').click()
time.sleep(2)
#4.点击语言
d(className = 'android.widget.RelativeLayout',index = '1').click()
time.sleep(2)
#5.点击添加语言(此时页面仅可存在一个语言,其他语言需提前删除)(需判断目前显示的语言是否和要搜索的一致)
d(resourceId = 'com.android.settings:id/add_language').click()#6.点击搜索
d(resourceId = 'android:id/locale_search_menu').click()#7.输入需要更换的语言(此时要注意一个语言下面还有分支的情况)
Changelanguage = 'Čeština'  #Suomi Akan
d(resourceId = 'android:id/search_src_text').send_keys(Changelanguage)
d.implicitly_wait(5)
#8.选择更换的语言
d(resourceId = 'android:id/locale').click()time.sleep(2)
print("准备点击小点")
#9.选择右上角的三个小点,remove
d(className = 'android.widget.ImageButton',index='1').click()
print("点好了")#10.点击移除(把选择之前的语言移除掉)
d(resourceId = 'android:id/content').click()
time.sleep(3)
#11.勾选之前的语言(也就是第一个),这样把第一个删除之后,现在的语言就是需要更换的语言
d(className = 'android.widget.RelativeLayout',index = '0').click() #点击第一个语言
d(className = 'android.widget.TextView',index = '0').click() #点击删除
#12.由于点击第一个删除会触发系统提示弹窗,则勾选ok就好
d(resourceId = 'android:id/button1',index = '1').click()
time.sleep(1)
d.press("back") #返回到语言和输入法界面
time.sleep(1)
d.press("back") #返回到系统界面(开始进入系统更新对比)
print("-------------------------开始进入系统更新对比------------------")#13.进入系统更新界面
d(className = 'android.widget.LinearLayout',index = '8').click()#14.获取提示信息
WaringText = d(resourceId = 'com.lenovo.ota:id/text_new_version_content').get_text(timeout=5)
print(WaringText)#15.使用获取到的信息和表格里面的信息进行对比
语言切换识别对比warning信息进度:
目前以实现基本流程操作,读取并写入EXCEL部分还未开始①Uiautomator2所需相关配置可通过bat一键安装到设备并正常启动②可自动获取设备SN号并进行连接③可切换单语言的切换(语言下还有语言的切换还未实现)④可正常读取系统更新界面的Warning的text信息next step:实现通过读取表格的信息,进行单语言切换,把读取的信息写入到表格

pyinstaller遇到的问题

1.打包问题

ModuleNotFoundError: No module named ‘xxx’

依赖有第三方库的打包

-p 后面跟着的是第三方库的路径(这里我直接把整个site-package都集成到exe里面了)【 如果包含多个目录,则可以用分号隔开: 】

pyinstaller -F -p D:\K_Learning\pythonFiles\airtest_script\venv\Lib\site-packages devicesConnect.py

如何查看当前代码所依赖的第三方库的路径:

最近利用tkinter+python+pyinstaller实现了小工具的项目,在此记录下pyinstaller相关参数以及爬过的坑。一、pyinstaller相关参数-F, –onefile    打包一个单个文件,如果你的代码都写在一个.py文件的话,可以用这个,如果是多个.py文件就别用  (这个方便)-D, –onedir    打包多个文件,在dist中生成很多依赖文件,适合以框架形式编写工具代码,我个人比较推荐这样,代码易于维护
-K, –tk    在部署时包含 TCL/TK
-a, –ascii    不包含编码.在支持Unicode的python版本上默认包含所有的编码.
-d, –debug    产生debug版本的可执行文件
-w,–windowed,–noconsole    使用Windows子系统执行.当程序启动的时候不会打开命令行(只对Windows有效)
-c,–nowindowed,–console
使用控制台子系统执行(默认)(只对Windows有效)pyinstaller -c  xxxx.pypyinstaller xxxx.py --console-s,–strip    可执行文件和共享库将run through strip.注意Cygwin的strip往往使普通的win32 Dll无法使用.
-X, –upx    如果有UPX安装(执行Configure.py时检测),会压缩执行文件(Windows系统中的DLL也会)(参见note)
-o DIR, –out=DIR    指定spec文件的生成目录,如果没有指定,而且当前目录是PyInstaller的根目录,会自动创建一个用于输出(spec和生成的可执行文件)的目录.如果没有指定,而当前目录不是PyInstaller的根目录,则会输出到当前的目录下.
-p DIR, –path=DIR    设置导入路径(和使用PYTHONPATH效果相似).可以用路径分割符(Windows使用分号,Linux使用冒号)分割,指定多个目录.也可以使用多个-p参数来设置多个导入路径,让pyinstaller自己去找程序需要的资源
–icon=<FILE.ICO>
将file.ico添加为可执行文件的资源(只对Windows系统有效),改变程序的图标  pyinstaller -i  ico路径 xxxxx.py–icon=<FILE.EXE,N>    将file.exe的第n个图标添加为可执行文件的资源(只对Windows系统有效)
-v FILE, –version=FILE    将verfile作为可执行文件的版本资源(只对Windows系统有效)
-n NAME, –name=NAME    可选的项目(产生的spec的)名字.如果省略,第一个脚本的主文件名将作为spec的名字
二、pyinstaller爬坑总结第一次玩pyinstaller,遇到了不少坑,在这里总结一下,以免日后再次掉坑里。1、先从这次写的工具再说吧,写这个工具的初衷是由于自己手工造数据文件花了很长时间,然后就想着写个工具来解决这个问题(也是想锻炼下自己的代码能力,哈哈哈),利用下班晚上以及周末写了一周大概写出来了。这个工具是个扫码支付文件生成工具,主要是解决手工造文件数据,有两个功能,一是基础扫码文件生成功能、二是大批量扫码文件生成功能,同时加上了用户auth控制。在这里提醒大家,在代码里面尽量不要用import,能from.....import....就尽量用这个,因为如果是import的话,在打包的时候,会将整个包都打包到exe里面,没有意义的增大了工具的大小!大概框架如下:2、Gui开发完毕后,开始研究pyinstaller,也翻阅了论坛关于pyinstaller的相关用法,这里总结下我的工具的打包步骤2.1、先下载pyinstaller,我比较懒,就直接用pip install pyinstaller,等待自动安装2.2、在代码的路径下进行cmd,就直接跳转到该路径的cmd界面,切记路径中不要有中文2.3、先用后台模式生成工具exe,命令为pyinstaller xxxx.py文件,主要目的是为了看报错信息,解决了报错后,再生成完整版的工具tip:由于我的代码是存在依赖的,即多文件的,而非所有代码都在一个文件中的,所以我在这里没有使用-F,刚开始玩的时候不知道,老是用了-F生成了单文件的,没有生成依赖,老是不成功,各位朋友切记!下图为命令生成的日志,红框部分则为exe工具生成的路径,如果在日志中只有info信息的话,说明打包过程没有问题2.4、找到生成的exe文件,运行exe(生成的exe文件都会在dist目录下)运行时,我遇到了以下的报错信息,是在dist找到相关的图片资源,所以需要把所有关于工具所需的资源(包含图片以及依赖的.py文件都放进dist下的项目目录中)2.5、再次运行exe,此时运行成功,说明工具打包成功2.6、重新生成exe工具,去掉后台模式以及更换掉图标给大家推荐一个图标获取地址,里面ico蛮多的:easyicon下载了自己心仪的ico后,用-i+ico路径来替换默认ico,这次重新生成exe工具,命令为pyinstaller -i ico路径 -w xxxx.py再将需要的图片资源和代码文件放到dist下的项目文件夹中2.7、运行exe,能够打开则表示pyinstaller打包exe成功————————————————
版权声明:本文为CSDN博主「LuoZelin1989」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/bearstarx/article/details/81054134

(这是-F生成的)

pyinstaller -F -p D:\K_Learning\pythonFiles\airtest_script\venv\Lib\site-packages devicesConnect.py

Excel相关操作

import xlrd
import xlsxwriterclass rwExcel:def __init__(self):passdef readexcel(self):# todo 打开exclexl = xlrd.open_workbook(r'Test.xlsx')#print(xl.read())# todo 通过索引获取工作表table = xl.sheets()[0]print(table)# 获取一共多少行rows = table.nrowsprint(rows)# todo 获取第一行的内容,索引从0开始row = table.row_values(0)print(row)# todo 获取第一列的整列的内容col = table.col_values(0)print(col)# todo 获取单元格值,第几行第几个,索引从0开始data = table.cell(2, 2).valueprint(data)def writeexcel(self):# todo 创建excel文件xl = xlsxwriter.Workbook(r'../Excel_Report/test.xlsx')# todo 添加sheetsheet = xl.add_worksheet('sheet1')# todo 往单元格cell添加数据,索引写入sheet.write_string(0, 0, 'username')# todo 位置写入sheet.write_string('B1', 'password')# todo 设置单元格宽度大小sheet.set_column('A:B', 30)# todo 关闭文件xl.close()if __name__ == '__main__':w= rwExcel()read = w.readexcel()
import xlrdclass RWExcel:def __init__(self):# todo 打开excleself.xl = xlrd.open_workbook(r'./ExcelFiles/Test.xlsx')# todo 通过索引获取工作表self.table = self.xl.sheet_by_index(0)# print("工作表的名字为:{}".format(self.table.name))# 获取一共多少行self.rows = self.table.nrows# 获取一共有多少列self.cols = self.table.ncols# print("当前表一共有"+str(self.rows) +"行,"+ str(self.cols) + "列")# for i in range(rows):#     print(table.cell(i,0))   #打印第一列def getSelect(self):""":return: 获取表中select为1的行数(下标从0开始)"""#读取表格第一列除去第一行的值self.fristcol = self.table.col_values(0)fristcol_list = []fristcol_list.append(self.table.cell(0,0).value) #把第一行第一列的值加进去for i  in range(1,len(self.fristcol)) :# 把除去第一行的第一列的0和1强转为int类型的数值,并且加入到列表里面(第一行的值最后也在,目的是为了后面通过下标找对应的行)fristcol_list.append(int(self.fristcol[i]))#print("当前表第一列的值为:{}".format(fristcol_list))#获取fristcol_list中为1的下标,同时用一个列表存储这些下标indexlist = []for  i in range(len(fristcol_list)) :if fristcol_list[i] == 1 :  #如果为1,那就是需要运行这一行的代码,此时获取下标,就相当于是获取第几行indexlist.append(i)  # i就是下标#print("当前表中select是1的行数为:{}".format(indexlist))return indexlistdef selectLanguage(self):""":return: 获取表格中select为1所对应的语言列表"""indexlist = self.getSelect()  #获取select为1的列print("第二个方法里面的Select为1的行数{}".format(indexlist))print("---------------------------------")languagelist = []for  i in  indexlist:#获取对应select为1的平台切换语言列表(第4列)language = self.table.cell(i,3).valuelanguagelist.append(language)  #获取select为1对应的平板切换语言print("当前表中select为1对应的切换语言为:{}".format(languagelist))return languagelistdef list_dic(self):'''two lists merge a dict,a list as key,other list as value把select为1的行数作为键,把要切换的语言作为值:return:dict'''list1 = self.getSelect()list2 = self.selectLanguage()dic = dict(map(lambda x, y: [x, y], list1, list2))return dicdef differ(self,index):i = self.table.cell(index,2).valuej = self.table.cell(index,4).valueif i == j :print("一样")print(i)print("--------------------------------------")print(j)return "PASS"if i != j :print("不一样")return "FAILED"

excel的写入(在已有的表格插入数据)

from openpyxl import load_workbook
from .readExcelFile import RWExcel
#写入已存在的xlsx文件第一种方法
class Write_excel(object):'''修改excel数据'''def __init__(self,filename,index,msg):""":param filename: 测试的文件名:param index: 对应要写入的行数的下标:param msg: 需要写入的内容"""self.filename = filenameself.index = indexself.msg = msgdef write(self):#写入已存在的xlsx文件wb = load_workbook(self.filename)#生成一个已存在的wookbook对象wb1 = wb.active#激活sheetwb1.cell(self.index+1,5,self.msg)#往sheet中的第二行第五列写入msg的数据,注意这里的下标是从1开始wb.save(self.filename)  # 保存def write_result(self):result = RWExcel().differ(self.index)# 写入已存在的xlsx文件wb = load_workbook(self.filename)  # 生成一个已存在的wookbook对象wb1 = wb.active  # 激活sheetwb1.cell(self.index + 1, 6, result)  # 把对比的结果写入到表格中wb.save(self.filename)  # 保存def saveExcel(self):pass# if __name__ == '__main__':
#     run = Write_excel().write("./Test.xlsx",1,"你好,摩西摩西")

获取设备的SN号

通过获取设备的SN号连接设备

import os
class adbDevices():def __init__(self):passdef readSN(self):text = os.popen("adb devices | findstr /v List").read()Sn = text.split('d')[0].split()[0]return Sn

主流程代码

import time
import datetime
from language_draft_exe.commonFiles.readSerialNumber import adbDevices
from language_draft_exe.commonFiles.readExcelFile import RWExcel
from language_draft_exe.commonFiles.writeExcel import Write_excel
import uiautomator2 as u2class readWarningTest():def __init__(self):passdef connect(self):# 连接手机print("---------------正在获取设备的SN号----------------")SN = adbDevices().readSN()  # 获取涉笔的SN号print("------------------获取成功,设备的SN号为:" + SN + "----------------------")time.sleep(5)print("---------------------------正在连接设备---------------------")self.d = u2.connect(SN)  # HA12FYBL\HA12G0GW\HA169RPZ填入设备的SN号即可self.sizeTuple = self.d.window_size()print("--------------------设备连接成功,先回到主页面-----------------")#self.d.press('home')#print("回到主页面成功,正在把屏幕调到自然方向")#time.sleep(3)#self.d.set_orientation("n")  # or "natural"#print("屏幕调整完成,正在启动应用")def readWarning(self,Changelanguage):""":param Changelanguage: 需要切换的语言:return: 返回切换语言之后的warningtext"""self.d.press('home')print("-------------------回到主界面成功,正在启动应用!-----------------")time.sleep(3)self.d.implicitly_wait(20)#启动应用self.d.app_start("com.android.settings")print("---------------------应用启动成功---------------------")#创建session连接对象,建议与设置应用的绑定连接s = self.d.session('com.android.settings',attach=True)time.sleep(3)#获取设备的尺寸print(self.d.window_size())x = self.sizeTuple[0]y = self.sizeTuple[1]print("屏幕的宽为:"+str(x) +",屏幕的高为:"+str(y)) #获取屏幕的宽高#1.进入设置之后,划动屏幕找到Systemtime.sleep(3)print("---------------------开始滑屏--------------------")self.d.swipe(x/5 * 4,y/5 * 4,x/5*4,y/5*1,1,50)self.d.swipe(x/5 * 4,y/5 * 4,x/5*4,y/5*1,1,50)print("---------------------滑屏结束-----------------------")self.d.implicitly_wait(5)#2.通过class和下标点击系统(开发者模式)self.d(className = 'android.widget.LinearLayout',index = '18').click()time.sleep(1)#3.点击语言和输入法self.d(className = 'android.widget.LinearLayout',index = '1').click()time.sleep(2)#4.点击语言self.d(className = 'android.widget.RelativeLayout',index = '1').click()time.sleep(2)#5.点击添加语言(此时页面仅可存在一个语言,其他语言需提前删除)(需判断目前显示的语言是否和要搜索的一致)self.d(resourceId = 'com.android.settings:id/add_language').click()#6.点击搜索self.d(resourceId = 'android:id/locale_search_menu').click()#7.输入需要更换的语言(此时要注意一个语言下面还有分支的情况)# Changelanguage = 'Čeština'  #Suomi Akantime.sleep(3)#7.1 单语言切换if "/" not in Changelanguage:self.d(resourceId = 'android:id/search_src_text').send_keys(Changelanguage)self.d.implicitly_wait(5)#8.1选择更换的语言,text要是选择的语言,有的语言会有推荐语言列表self.d(resourceId = 'android:id/locale').click()time.sleep(1)#7.2 多语言切换(英语有很多页,需要滑动的,分开操作)if "/" in Changelanguage:Changelanguage = Changelanguage.replace("/","-")print("含有/符号的value:{}".format(Changelanguage))  # 把含有/的value打印出来multilingual = Changelanguage.split("-")  # 分割好的语言放在这个里面print("--------------------------------")print("分割的", multilingual)hostLanguage = multilingual[0]   #获取多语言的主语言secondLanguage = multilingual[1]  #获取多语言的子语言time.sleep(3)if multilingual[0] == "English":self.d(resourceId='android:id/search_src_text').send_keys(hostLanguage)self.d.implicitly_wait(5)# 8.1点击主语言进入次语言的选择界面self.d(resourceId='android:id/locale',text = hostLanguage ).click()time.sleep(2)#寻找子语言,如果子语言不存在,则滚动屏幕,直到找到子语言,找到子语言则跳出循环,进行后面的操作flag = Truewhile flag:# 判断元素是否存在time.sleep(5)judgeElement = self.d(resourceId='android:id/locale', text=secondLanguage).existsif judgeElement:print("---------------次语言查找成功----------------")self.d(resourceId='android:id/locale', text=secondLanguage).click()flag = Falseelse:x = self.sizeTuple[0]   #获取屏幕的宽y = self.sizeTuple[1]   #获取屏幕的高print("--------------滑屏寻找元素--------------")# 1.进入设置之后,划动屏幕找到Systemself.d.swipe(x / 5 * 4, y / 5 * 4, x / 5 * 4, y / 5 * 3, 1, 50)self.d.swipe(x / 5 * 4, y / 5 * 4, x / 5 * 4, y / 5 * 3, 1, 50)#d(resourceId = 'android:id/locale',text = secondLanguage).click()else:   #不是英语的其他多语言self.d(resourceId='android:id/search_src_text').send_keys(hostLanguage)self.d.implicitly_wait(5)# 8.1点击主语言进入次语言的选择界面self.d(resourceId='android:id/locale', text = hostLanguage).click()time.sleep(2)self.d(resourceId='android:id/locale', text=secondLanguage).click()time.sleep(2)print("准备点击小点")#9.选择右上角的三个小点,removeself.d(className = 'android.widget.ImageButton',index='1').click()print("点好了")#10.点击移除(把选择之前的语言移除掉)self.d(resourceId = 'android:id/content').click()time.sleep(3)#11.勾选之前的语言(也就是第一个),这样把第一个删除之后,现在的语言就是需要更换的语言self.d(className = 'android.widget.RelativeLayout',index = '0').click() #点击第一个语言self.d(className = 'android.widget.TextView',index = '0').click() #点击删除#12.由于点击第一个删除会触发系统提示弹窗,则勾选ok就好self.d(resourceId = 'android:id/button1',index = '1').click()time.sleep(1)self.d.press("back") #返回到语言和输入法界面time.sleep(1)self.d.press("back") #返回到系统界面(开始进入系统更新对比)print("-------------------------开始进入系统更新对比------------------")#13.进入系统更新界面self.d(className = 'android.widget.LinearLayout',index = '8').click()#14.获取提示信息WaringText = self.d(resourceId = 'com.lenovo.ota:id/text_new_version_content').get_text(timeout=5)# print(WaringText)#14.获取到信息之后截屏,截图该屏幕并保存到同目录的screen文件中,图片名称为时间+语言nowTime = datetime.datetime.now().strftime('%m-%d-%H-%M-%S')self.d.screenshot("./Screenshorts/{}_{}.jpg".format(Changelanguage,nowTime))return WaringText# 15.把获取到的信息写入到表格中,使用获取到的信息和表格里面的信息进行对比def judgeResult(self):#获取select为1的行数和语言的键值对  eg.{3: 'Latviešu', 4: '日本語'}languageList = RWExcel().list_dic()print(languageList)for key, value in languageList.items():print("index:{},value:{}".format(key, value))# key作为第几行直接输入print("---------------------开始切换语言-------------")print("所切换的语言为:{}".format(value))msg = Run.readWarning(value)print(msg)print("-------------------开始把warning信息写入到对应表格中-------------------")write = Write_excel(r'./ExcelFiles/Test.xlsx', key, msg)#把获取到的warning信息写入进入表格write.write()print("-------------------Warning信息写入成功--------------------------")print("----------------------开始对比系统提示与标准描述模板是否一致----------------")print("-------------------开始把测试结果写入到对应表格中-------------------")#把对比之后的测试结果写入到表格write.write_result()print("-------------------测试结果写入成功--------------------------")if __name__ == '__main__':Run = readWarningTest()# language = "Dansk"#Run.readWarning("English/Tuvalu")Run.connect()Run.judgeResult()

运行界面

截图文件:

报告结果:

初代版本代码链接:

链接:https://pan.baidu.com/s/1ahUS8yXUMgBiTGN0SDgopQ
提取码:xznb
复制这段内容后打开百度网盘手机App,操作更方便哦

我就很棒!

欢迎关注我的微信公众号:
梦无矶的测试开发之路

python + uiautomator2编译平板语言工具并切换打包exe可执行文件相关推荐

  1. Python 反编译:pyinstxtractor工具和uncompyle6库的使用

    uncompyle6 现仅适用于 Python 2.4 到 3.8 版本 Python 3.9 及以上版本请参见我另外一篇博客: Python 反编译:pycdc工具的使用 ✅作者简介:人工智能专业本 ...

  2. Python如何打包EXE可执行文件

    一.安装Pyinstaller 使用Python打包EXE可执行文件时,需要使用Pyinstaller,使用命令pip install PyInstaller进行安装,如下图: 安装成功后的效果如下图 ...

  3. python用turtle库制作实时钟表(可打包exe)

    实时钟表 源代码 打包exe 源代码 python引入两个内置库turtle和datetime即可制作一个实时钟表,代码如下: # 用turtle画时钟 # 以自定义shape的方式实现 import ...

  4. python的py文件打包exe可执行文件(传参+读取文件)

    python打包成可执行文件用pyinstaller即可完成 但是如果需要考虑传参和读取文件,就显得不是那么丝滑了.(找了蛮久才解决的) 下面将展示如何完成打包后的exe文件实现能够传参+读取文件 首 ...

  5. Python 反编译:pycdc工具的使用

    ✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程.

  6. python反编译exe_实战 Python3.7+64位 Exe 反编译

    记得有年在上海弘连培训,其中一个逆向题就是关于python的Exe,当时就想着写个文档,后来因为忙就拖延了下来:这里补上,而且是大补上:奉献一个干货,网上没有(我没发现)Python3.7的反编译教程 ...

  7. python实现pdf转excel_使用python写的PDF转EXCEL工具,已打包exe

    1.转换 PDF中的表格 文件到 Microsoft Excel 文档 2.程序自动识别pdf中的表格 3.电子工程师用excel建原理图的库(orcad)会需要,特别是引脚多的原理图库,如FPGA等 ...

  8. python发布exe_Python:程序发布方式简介一(打包为可执行文件EXE)

    n 本文介绍如何使用py2exe来将python源程序打包成文件.以上一篇文章[<Python:一个多功能的抓图工具开发(附源码)>](http://blog.csdn.net/dyx10 ...

  9. python 生成exe 图片资源_爱豆图片下载(含源码及打包exe可执行文件)

    import requests from lxml import etree import os # etree解析网页并返回 def parse(url): headers = { 'User-Ag ...

最新文章

  1. CentOS6.0_X86_64 oracle 11g R2 开机自动启动(linux)
  2. 微信的通讯录首字母滑动的实现
  3. ds oracle connector 连接组件,Datastage 8.5 连接远程Oracle 数据库
  4. 亲测有用的downie下载站点
  5. PyTorch深度学习实践07
  6. Java之递归遍历目录,修改指定文件的指定内容
  7. 怎么创建数据表的实体类和业务类_微服务项目第13天:商品分类业务的实现
  8. 光流(一)--综述概览
  9. 安卓+JAVA实例开发源码
  10. Windows XP中的通用即插即用
  11. 用模拟退火算法估价heston期权定价模型的五个参数
  12. 【stm32f407】硬件介绍
  13. 面向对象系列(三)-抽象类的特点
  14. CMarkup类操作XML
  15. postgresql数据库中多个Schemas互相访问
  16. Nodulus玩法介绍
  17. 苹果笔记本装windows10后,如何一键截屏并保存到onedrive中?
  18. 快速获取网页元素xpath的方法
  19. Scrapy学习第四课
  20. Android短信之SmsManager类,flutter推送通知

热门文章

  1. 2019天梯赛 吃鱼还是吃肉 (10 分)
  2. 一直用眼镜布擦眼镜,其实眼镜布并不是用来擦眼镜的
  3. 两个视频左右拼接成一个视频,且两个视频音频都保留
  4. Postman官方64位版本下载
  5. FLUX WMS 自定义面单打印
  6. Fusion360学习记录:螺帽
  7. 互联网时代的毁灭——海拉virus
  8. 毫米波角雷达进入“新赛道”
  9. Unity坐标系 左手坐标系
  10. css写不规则三角形