首页
留言板
推荐
Allen知识库
Search
1
VMware vSphere系列教程-部署DC/DHCP/DNS(五)
21 阅读
2
最强链路监控系统推荐Pinpoint
21 阅读
3
PC新时代开启! DDR5内存标准正式发布
19 阅读
4
Ansible系列教程-常用模块(二)
13 阅读
5
将物理机迁移到VMware虚拟机(P2V)
13 阅读
VMware
vCloud
Horizon
vSphere
NSX
运维相关
Docker
Network
Zabbix
Ansible
Python
Microsoft
Mysql
Linux
Windows Server
登录
/
注册
Search
标签搜索
ansible
docker
zabbix
chatgpt
windows模板
linux模板
模板
k3
lede
openwrt
docker网络配置
清理微信好友
python清理微信好友
grafana
监控交换机
实施教程
ansible安装
ubuntu
acrh17路由固件
访问宽带猫
Allen
累计撰写
134
篇文章
累计收到
0
条评论
首页
栏目
VMware
vCloud
Horizon
vSphere
NSX
运维相关
Docker
Network
Zabbix
Ansible
Python
Microsoft
Mysql
Linux
Windows Server
页面
留言板
推荐
Allen知识库
搜索到
28
篇与
的结果
2022-06-13
使用textfsm解析华为交换机配置进行巡检
一、概述有将近200台左右的接入交换机,全部是华为S57系列的。现在需要对交换机状态进行巡检,检查交换机CPU,内存,电源,风扇状态。如果是人工巡检就得一台一台登录查看,效率非常低下。由于客户这里没有使用网管软件,全凭人肉运维。=。=现在想使用python来进行巡检,并把结果统计到一张表格里面,这样不就非常省事了么二、现状以下是设备资产列表,记录的设备的名称,管理地址等信息以下是交换机检查命令的输出结果,分别使用display fan,display cpu,display mem,display power,display enviroment现在我们获取到这些状态了,接下的问题是如何解析这些文本并保存?三、问题:1.如何批量保存状态文本? 2.保存后如何解析这些文本? 3.解析文本出来后,如何格式存储到表格中?针对如上问题,采取如下思路解决四、思路:1.使用pandas模块读取表格,获取需要ssh登录的设备信息 2.使用netmiko模块批量发送命令给交换机 3.将回显的结果批量保存到指定路径下 4.批量读取这些文本,使用textfsm解析文本, 5.将解析结果使用pandas模块分门别类的保存一张表格中的不同sheet有了思路,就好解决了,为了实现以上的思路,需要了解python的一些模块的使用五、第三方包5.1 netmiko此模块用于简化paramiko与网络设备之间的ssh连接,可在windows与Unix平台使用 常用方法net_connect.send_command() # 向下发送命令,返回输出(基于模式) net_connect.send_command_timing() # 沿通道发送命令,返回输出(基于时序) net_connect.send_config_set() # 将配置命令发送到远程设备 net_connect.send_config_from_file() # 发送从文件加载的配置命令 net_connect.save_config() # 将running#config保存到startup#config net_connect.enable() # 输入启用模式 net_connect.find_prompt() # 返回当前路由器提示符 net_connect.commit() # 在Juniper和IOS#XR上执行提交操作 net_connect.disconnect() # 关闭连接 net_connect.write_channel() # 通道的低级写入 net_connect.read_channel() # 通道的低级写入5.2 TextFSMTextFSM是Google开发的一种开源Python模块,可以基于模板的状态机来解析半格式化文本,从而实现对网络设备CLI输出信息进行结构化数据处理,最终将文本内容输出为Python的字典或列表格式(或者是两者组合)。 详细内容可以访问该模块的GitHub: https://github.com/google/textfsm。关于TextFSM具体使用,还可以参考锐捷的资料 https://www.ruijie.com.cn/fa/xw-hlw/86889/我的TextFSM就是照着锐捷的模板借鉴使用5.3 相关脚本华为TextFSM解析fan Value SLOT_ID (\d/\d|\d) Value FAN_ID (\d) Value STATUS (\S+) Start ^Slot ${SLOT_ID}: Fan ${FAN_ID} is ${STATUS} -> Record解析powerValue POWER_ID (\d|\S+\d) Value STATUS (Normal|Abnorma) Start ^SlotID\s+.* State ^\s+${POWER_ID}\s+.* ${STATUS} -> Record解析温度Value ID (\d) Value TEMP (\d+) Start ^SlotID\s+CurrentTemperature ^\s+${ID}\s+${TEMP} -> Record解析cpu和mem 因为cpu和mem比较简单,可以直接使用正则表达式,无需使用TextFSMr'CPU utilization for five seconds:\s+\d+%' r'Memory Using Percentage Is:\s+\d+%'脚本 直接看注释把import netmiko import pandas as pd import os import time from textfsm import TextFSM import re import glob #此模块是匹配路径下所有文件 class Conn(): #Conn类,同时netmiko模块ssh连接设备并发送命令 @property #将方法转换为属性,方便更改 def ip(self): return self._ip @ip.setter def ip(self,ip): self._ip=ip @property def device_name(self): return self._device_name @device_name.setter def device_name(self,device_name): self._device_name=device_namedef init(self): ''' 构造属性,定义登录设备的账户密码信息 ''' self.username='admin' self.password='xxxxx' def save_config(self): ''' 保存配置方法 ''' ssh_login=netmiko.Netmiko(ip=self._ip,username=self.username,password=self.password,device_type='huawei') #初始化连接 path='backup/' #定义保存的文本的路径 config=ssh_login.send_command('di cu') #发送命令 config_file=self._device_name+'-'+self._ip+'.txt' #定义文本文件名称 backup_file=os.path.join(path,config_file) #拼接路径 with open (backup_file,'w') as f: #保存写入 f.write(config) def check_status(self,path): ''' 获取状态信息的方法,获取cpu,fan等信息 ''' ssh_login=netmiko.Netmiko(ip=self._ip,username=self.username,password=self.password,device_type='huawei') command=['display fan','display cpu','display environment','display power','display memory-usage','display temperature all'] #批量发送命令 status=ssh_login.send_config_set(command) filename=self._device_name+'-'+self._ip+'.txt' status_file=os.path.join(path,filename) with open (status_file,'w') as f: f.write(status) #使用text-fsm检查交换机配置状态 #生成表格 list_device_name=[] #定义列表保存信息 list_fans_status=[] list_power_status=[] list_cpu_status=[] list_mem_status=[] list_temp_status=[] count_fan_dict={} #定义字典,保存状态信息 count_power_dict={} count_cpumem_dict={} count_temp_dict={} class CHCEK(): ''' 解析状态的类 ''' def **init**(self,file): self._file=None with open(file,'r',encoding='utf-8') as f: #构造初始化方法,定义读取文件,即保存的状态信息 self.dev_text=f.read() def fans_status_S86X(self): ''' 解析fan ''' temp_fans_status=TextFSM(open(r'textfsm/huawei_display_fan_dis.textfsm')) #读取textfsm模板解析 info_fans_status=temp_fans_status.ParseTextToDicts(self.dev_text) #保存为列表 print (info_fans_status) return info_fans_status def power_status_S86X(self): #解析power temp_power_status=TextFSM(open(r'textfsm/huawei_display_power_dis.textfsm')) info_power_status=temp_power_status.ParseTextToDicts(self.dev_text) print (info_power_status) return info_power_statusdef cpu_status_S86X(self): ''' temp_power_status = TextFSM(open(r'textfsm/ruijie_show_cpu_S86X.textfsm')) self.info_power_status = temp_power_status.ParseTextToDicts(self.dev_text) ''' cpu_status=re.findall(r'CPU utilization for five seconds:\s+\d+%',self.dev_text) #使用正则表达式解析cpu cpu_status=''.join(cpu_status) info_cpu_status=re.findall(r'\d+%',cpu_status) #第二次匹配,更加准确 print(info_cpu_status) return info_cpu_status def mem_status_X86x(self): #解析内存利用率 mem_status=re.findall(r'Memory Using Percentage Is:\s+\d+%',self.dev_text) #正则匹配 mem_status=''.join(mem_status) info_mem_status=re.findall(r'\d+%',mem_status) print (info_mem_status) return info_mem_statusdef temp_status_S86X(self): ''' 解析温度 ''' temp_temp_status = TextFSM(open(r'textfsm/huawei_display_temp_dis.textfsm')) info_temp_status = temp_temp_status.ParseTextToDicts(self.dev_text) print(info_temp_status) return info_temp_status def handle(path): ''' 处理解析出来的信息 ''' filelocation=glob.glob(path) #获取路径下的所有文件 for file in filelocation: print(file) device_name=file.split('.txt')[0].split(r'\\')[-1] #读取文件名,字符拆分为设备名 device_name=device_name.replace('check_status_dis\\','') print (device_name) list_device_name.append(device_name) #添加到设备名列表 check=CHCEK(file=file) #实例化化CHECK()对象 fans_status=check.fans_status_S86X() #获取fan信息 list_fans_status.append(fans_status) #保存fan信息,以下类似 power_status=check.power_status_S86X() list_power_status.append(power_status) cpu_status=check.cpu_status_S86X() list_cpu_status.append(cpu_status) mem_status=check.mem_status_X86x() list_mem_status.append(mem_status) temp_status=check.temp_status_S86X() list_temp_status.append(temp_status) def to_excel(): #保存到表格 count_fan_dict['device_name']=list_device_name #字典,定义键名 device_name,值为列表,设备信息,以下类似 count_fan_dict['fans_status']=list_fans_status count_power_dict['device_name']=list_device_name count_power_dict['powers_status']=list_power_status count_cpumem_dict['device_name']=list_device_name count_cpumem_dict['cpu_status']=list_cpu_status count_cpumem_dict['mem_status']=list_mem_status count_temp_dict['device_name'] = list_device_name count_temp_dict['temp_status']=list_temp_status df1=pd.DataFrame.from_dict(count_fan_dict,orient='index') #pandas方法,把字典转换为DATAFRAME,保持索引 df1=df1.T #行类转换,以下类似 df2=pd.DataFrame.from_dict(count_power_dict,orient='index') df2=df2.T df3=pd.DataFrame.from_dict(count_cpumem_dict,orient='index') df3=df3.T df4=pd.DataFrame.from_dict(count_temp_dict,orient='index') df4=df4.T with pd.ExcelWriter('result-dis.xls') as w: #保存到excel表格 df1.to_excel(w,sheet_name='fans_status',index='SN') #保存到sheet ,名称为fans_status,索引名称为SN,代表序号,以下类似 df2.to_excel(w, sheet_name='power_status', index='SN') df3.to_excel(w, sheet_name='cpu&mem_status', index='SN') df4.to_excel(w, sheet_name='temp', index='SN') if **name**=='**main**': clock=time.strftime("%a %b %d %H:%M:%S %Y", time.localtime()) #定义时间格式 conn=Conn() #实例化Conn(),登录设备 df = pd.DataFrame(pd.read_excel('交换机信息-汇聚.xls')) #读取设备配置信息 df_dict = df.groupby(['设备名称'])['MGT地址'].sum() #分组保存列,形成,以设备名为键,管理地址为值的字典 dict_device =df_dict.to_dict() # 保存为字典 path=r'check_status_dis/' #定义输出结果路径for k,v in dict_device.items(): #循环字典 print (k) print (v) try: conn.ip=v #赋值地址信息给属性 conn.device_name=kconn.save_config() conn.check_status(path) #调用check_status方法,开始从发送命令并保存 print(' device_name:{}--ip:{} is download status file ok!!!time is {}'.format(k, v, clock)) except Exception as e : print('{} is loss , msg:-{},time is {}'.format(k, e, clock), file=open('back_error_log.txt', 'a')) #将无法登录的设备信息保存到文本中handle(path=path+'*.txt') #进行处理 to_excel() #结果保存到excel保存完成后,输出的excel表格如下所示:有了这张表,再人工筛选下表格,就能找出来那些设备有问题。 这样就实现了最简单的设备健康检查及巡检。从结果来看,确认有交换机电源有问题。六、需要改进的地方单线程,运行起来比较慢,后续可以使用线程池实现多线程 没有逻辑判断,需要人工检查哪些正常,哪些异常 后续使用ntc-templates,并自定义模板,这样不用把信息保存到本地,可以省一个步骤 详细的脚本,见我代码库 https://gitee.com/yashirochaos/yangchao/blob/master/python3工作使用/30交换机健康检查/2华为交换机检查/check_switch_status_huawei_v3.py
2022年06月13日
0 阅读
0 评论
0 点赞
2021-07-30
开发:会议室预定系统(2021-09-02更新)
概述最近在学习Python,于是利用空闲时间,使用django编写一个会议室预订系统,目前刚刚开始,功能还很缺失,主要用于学习使用。目前想法就是先把功能实现,事后在优化代码。。。点我获取代码功能完成情况1、 前端使用layui,后端django,没有用其他模块。2、新增登录功能(2021.08.02新增)3、新增预定按钮和编辑按钮可用(2021.08.02新增)4、新增预定会议室表单,但是还未实现点击某个会议室预定,在选择栏自动加载名字(2021.08.02新增)5、新增个人中心,具体信息还未设置获取。(2021.08.02新增)6、修改预定会议室功能,下拉列表显示可预约会议室(2021.08.03)7、增加预定会议室显示预约人功能(2021.08.03新增)8、新增登录后,右上角正常显示用户名功能(2021.08.03新增)9、修改用户验证类型为django默认用户类型(2021.08.07)10、修复更改为django默认用户类型无法登录问题(2021.08.09)11、数据库切换成mysql(2021.08.11)12、新增预定会议室提交功能(2021.08.11)13、新增我的预定里编辑、删除按钮功能正常(2021.08.16)14、新增个人资料(2021.08.16)15、已知bug:预定超过一个以上的会议室,点删除会议室,会全部删除.(2021.08.24)16、修复已预定会议室编辑、删除功能按钮。(2021-09-02)展示界面展示 预定功能
2021年07月30日
1 阅读
0 评论
0 点赞
2021-03-05
Python 自动化清理微信僵尸好友(二)
一、概述自从 微信网页版 被限制登陆之后wxpy库就基本没啥用了,但是还是有很多同学想学微信自动化,其实有些功能是可以用其他自动化库代替的,今天就给大家介绍一下如何使用 appium库 删除那些僵尸好友!随着微信的使用时间越长,微信好友也越来越多,有些好友将你删除了你也不知道。当我们发消息的时候会出现下面扎心的一幕,然后默默将他删除二、下载 Appium库这里使用最新 1.20.0 版本的 appium,旧版本会出现真机微信闪退的情况安装一下 Python 用到的模块#pip install Appium-Python-Client三、获取好友列表在 Pycharm 中配置一下启动环境desired_capabilities = { 'platformName': 'Android', # 操作系统 'deviceName': '2a254a02', # 设备 ID,使用 cmd 中 adb devices 命令得到 'platformVersion': '10.0.10', # 设备版本号,在手机设置中查看 'appPackage': 'com.tencent.mm', # app 包名 'appActivity': 'com.tencent.mm.ui.LauncherUI', # app 启动时主 Activity 'noReset': True # 是否保留 session 信息 避免重新登录 } driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_capabilities) print('微信启动')下图是 appium 启动后截图点击红框中按钮,将上面的参数填上,点击 start Session启动后点击刷新按钮,看到的界面和真机上一样了,在真机上点击通讯录按钮并刷新界面在 appium 界面点击一个好友,可以看到这个好友有一个 content-desc 和 resource-id 代表了昵称和资源 id 然后我们用 Python 获取所有的好友昵称# 所有好友 friends = [] def get_friends(): # 好友id address_list = driver.find_elements_by_id('com.tencent.mm:id/dy5') for address in address_list: # 昵称 friend = address.get_attribute('content-desc') # 过滤掉自己、微信团队、文件夹传输助手 if friend != '某某白米饭' and friend != '微信团队' and friend != '文件夹传输助手': friends.append(friend) # 获取到最后一个好友返回 if friend == '?Jiuki?': return # 向上滚动获取好友,获取好友会重复,最后结果需过滤 driver.swipe(100, 1000, 100, 500) # 递归循环得到所有好友 get_friends()四、得到被对方删除的好友在微信中被对方删除后,是不能进行转账的,这也是用来判断被对方删除的依据下面四步骤就是用 Python 模拟微信转账操作按上面获取的昵称搜索得到好友 在好友对话框中点击 + 号,获取到转账按钮 在转账界面输入 1 元,点击转账按钮,得到是否为好友结果 最后返回到搜索页面清空搜索框内容# 判断是否被删 def is_del(f): time.sleep(2) driver.find_element_by_id('com.tencent.mm:id/cn1').click() time.sleep(2) # 在搜索框输入搜索信息 driver.find_element_by_id('com.tencent.mm:id/bhn').send_keys(f) time.sleep(2) #点击好友 driver.find_element_by_id('com.tencent.mm:id/tm').click() time.sleep(2) # 转账操作 + 号 driver.find_element_by_id('com.tencent.mm:id/aks').click() time.sleep(2) # 转账按钮 driver.find_elements_by_id('com.tencent.mm:id/pa')[5].click() time.sleep(2) # 数字 1 driver.find_element_by_id('com.tencent.mm:id/cx_').click() time.sleep(1) # 付款界面转账按钮 driver.find_element_by_id('com.tencent.mm:id/cxi').click() time.sleep(2) # 判断是否被删 is_exist = is_element('com.tencent.mm:id/dos') if is_exist: # 不能转账就点击确定按钮 driver.find_element_by_id('com.tencent.mm:id/doz').click() time.sleep(2) else: # 可以转账就后退 driver.press_keycode(4) # 后退到 搜索页面 driver.press_keycode(4) driver.press_keycode(4) driver.press_keycode(4) driver.press_keycode(4) # 清空文本框 driver.find_element_by_id('com.tencent.mm:id/bhn').send_keys('') return f def is_element(id): flag = None try: driver.find_element_by_id(id) flag = True except NoSuchElementException: flag = False finally: return flag因为 appium 操作 APP 有延迟,所以在每个操作后延迟 2 秒五、删除好友在得到被删好友的联系人之后,用个步骤在 Python 中微信删除好友在搜索框中用昵称搜索被删好友的联系人 进入对话界面后,点击界面右上角的... 点击好友头像 点击个人信息界面右上角的... 点击删除按钮 在选择框中点击删除# 删除好友 def del_friend(friend): time.sleep(2) driver.find_element_by_id('com.tencent.mm:id/cn1').click() time.sleep(2) driver.find_element_by_id('com.tencent.mm:id/bhn').send_keys(friend) time.sleep(2) #点击好友 driver.find_element_by_id('com.tencent.mm:id/tm').click() time.sleep(2) # 右上角... driver.find_element_by_id('com.tencent.mm:id/cj').click() time.sleep(2) # 头像 driver.find_element_by_id('com.tencent.mm:id/f3y').click() time.sleep(2) # 右上角... driver.find_element_by_id('com.tencent.mm:id/cj').click() time.sleep(2) # 删除按钮 driver.find_element_by_id('com.tencent.mm:id/g6f').click() time.sleep(2) # 选中删除 driver.find_element_by_id('com.tencent.mm:id/doz').click()六、总结今天我们学习了如何使用 appium自动化清理了微信僵尸好友,其实appium是一个非常强大且操作简单的库,你完全可以用它去做更多的事情!猪哥之前就是用appium库做了微信搜索结果存储的程序,非常好用,下次有机会再为大家带来一些关于appium库的实践案例!本文源码:https://github.com/JustDoPython/python-examples/tree/master/moumoubaimifan/wxDelFriends
2021年03月05日
0 阅读
0 评论
0 点赞
2021-03-05
Python 自动化清理微信僵尸好友(一)
文章来源:Python 技术「ID: pythonall」一、概述从石器时代开始,原始人来已经开始学会制造并使用工具,以满足自己的生活所需,这也是人类和动物最本质的区别,人类懂得制造并使用工具而动物不会。21 世纪的现代社会更是如此,企业与企业之间是人才的竞争,而人的竞争力则严重依赖其会使用工具的多少以及熟练程度,毕竟古人有云:「君子生非异也,善假于物也」。软件测试作为软件发布前的最后一个环节,起着至关重要的作用。虽然在很多公司里相对于开发来讲,公司对测试岗都不太重视,但这绝对不能掩盖其地位的重要性,稍有疏漏,就可能给公司带来巨大的损失。纵观国内各公司大部分的测试工作依然都是手动完成的,这不仅是对人力资源的巨大浪费,同时还伴随着巨大的潜在风险。因为人有时候会犯错,而机器则不会。所以我们要尽可能的把可以自动化的操作交给机器去完成,从而解放我们的双手,去做一些更有意义的事情。二、什么是 AppiumAppium 是一个开源的移动端自动化框架,可用于测试原生应用,移动网页应用和混合型应用,且其是跨平台的,可用于 iOS 和 Android 操作系统。这也就意味着你可以针对不同的平台使用同一套 Api 来编写测试程序,以提高代码的服用行和可维护性。三、设计思想为了更好的应对千变万化的需求,Appium 没有和某一门具体的语言绑死,开发者可以使用自己最熟悉的任何语言来使用该框架。Appium 之所以这么灵活完全得益于其优秀的设计思路,该框架使用 client-server 的设计模式,只要 server 端可以收到 client 端发送过来的请求,那么 client 端用什么语言来实现其实意义已经不大了,无关紧要。这样的设计思想带来了巨大的好处,其一就是使框架可以做到支持多语言,其二则是可以把 server 端放在任何机器上,即使是云服务器上也完全没有问题。四、入门想必在程序圈儿的你肯定对 Hello World 不陌生,每当我们学习一个新的技术的时候基本都会写一个 Hello World 的 demo 来快速熟悉该技术,同样,今天我就带着大家做一个入门 Appium。首先我们把环境搭建起来,依次安装下列软件。Android Studio JDK Python 3.8 PyCharm 网易模拟器 Appium 桌面版之所以需要安装 Android Studio 完全是因为链接安卓模拟器调试 App 程序时会用到 Android SDK,而 Android Studio 附带了 Andoid SDK,固直接安装 Android Studio。另外我们选择 Appium 桌面版,是因为桌面版附带可视化操作界面,对新手比较友好。其中前四个大家可能都比较熟悉,自行安装即可。Appium 则需从 https://github.com/appium/appium-desktop/releases/tag/v1.18.3 下载对应的版本直接安装就可以了。安装完成后启动 Appium,Host 和 Port 默认即可,接着点击下面的配置按钮进入配置页,设置完成 Android Home 和 Java Home 后直接启动 Server 就可以了。 当看到如下界面时,恭喜你,Server 已经启动成功了。五、启动成功接下来,我们开始完善 client 端,其实就是代码而已,直接调用 Api 即可。因为我们是要通过 Appium 来操控模拟器上的 App,所以需要先将模拟器启动。命令行输入 adb devices 如果看到以下信息,则说明模拟器是正常的。接着就是编写 client 端代码了,from appium import webdriver desired_capabilities = { "platformName": "Android", # 操作系统 "deviceName": "emulator-5554", # 设备 ID "platformVersion": "6.0.1", # 设备版本号 "appPackage": "com.tencent.mm", # app 包名 "appActivity": "com.tencent.mm.ui.LauncherUI", # app 启动时主 Activity 'noReset': True # 是否保留 session 信息 可以避免重新登录 } driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_capabilities) print('链接到安卓模拟器')有了以上信息之后,我们就可以通过程序直接链接到模拟器,然后自动启动微信 App 了。那么启动了微信 App 之后我们还可以做什么操作呢?基本上我们手动可以做的操作,程序都可以替我们完成。driver.find_element_by_id('com.tencent.mm:id/f8y').click() print('查找搜索按钮') time.sleep(3) driver.find_element_by_id('com.tencent.mm:id/bhn').send_keys('Python 技术') print('查找搜索输入框 & 写入搜索关键字') time.sleep(3) driver.find_element_by_id('com.tencent.mm:id/tm').click() print('点击 icon 图标') time.sleep(3) driver.find_element_by_id('com.tencent.mm:id/cj').click() print('点击右上角头像') time.sleep(3) driver.find_element_by_id('com.tencent.mm:id/a1u').click() print('点击第一篇文章')上面这一套代码做了什么操作呢,简言之就是通过搜索找到「Python 技术」公众号,然后再去到该公众号主页并且查看了第一篇文章。同时程序为了给 App 留出一点反应时间,我们在每次发送指令后均让程序休息 3 秒钟。细心的你可能发现了,上述代码主要涉及到三个 Api,find_element_by_id()、send_keys() 以及 click,看函数名也就知道是做什么的了。那么,我们怎么知道某个元素的 ID 呢?这时候就又要请出我们的桌面版 Appium 了。点击「启动成功」界面右上角的放大镜图标。之后将上述程序中的配置信息添加上去,最后点击「Start Session」按钮,不出意外的话你应该能看到微信启动界面了,就是那个地球。但是细心的你会发现,模拟器上的界面和 Appium 上的不一致,此时需要你刷新下 Appium 上的界面信息,点击下图中的刷新按钮就可以了。如果想获取某个元素的 ID,那么则先选中选择按钮,接着选中你想要获取 ID 的元素即可。六、总结今天我们学习了自动化神器 Appium,其实该框架不仅仅只是用来做测试,其用武之地可多着呢,比如定时给女票发微信提醒她「多喝热水」,哈哈哈,小伙伴们可以发挥自己的想象力做一些好玩的工具出来哦。
2021年03月05日
1 阅读
0 评论
0 点赞
2020-11-17
二十三、flask博客实战项目笔记本
环境描述 操作系统:Centos7.8 mini FLASK软件:相应软件最新版。时间为2020-11-16 系统环境包:requirements.txt , 下载本地在虚拟环境中运行 (venv) # pip3 freeze > requirements.txt 进行安装。 学到了什么 了解了基本功能模块 forms.py 调用表单 routes.py 访问路径 templates 前端模板 了解基本博客需要的基本模块,感觉能做成通用模板。。 其他待总结 总结 项目代码有缺陷,因为根据教程做的在优化结构章节,就出现了错误,导致后续部分功能无法正常使用,稍后会进行优化。 没有后台管理功能。 教程大部分情况写的比较细,让我了解了各个功能模块实现的方法,虽然很多还看不懂。 希望以后自己能从头到尾写一个完整博客程序。 教程中API教程没有做。
2020年11月17日
4 阅读
0 评论
0 点赞
1
2
...
6