我们的文章会在微信公众号“Oracle恢复实录”和博客网站“www.htz.pw” 同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!由于博客中有大量代码,通过页面浏览效果更佳。

1,聊聊自动化

1.1 什么是自动化

今天我们聊聊前几年非常火的一个词自动化,不是服务器上的数据库、操作系统的自动化,而是我们平时使用的电脑的自动化。在日常电脑工作中,我们有大量重复、相同的工作需要做,消耗我们大量的时间、精力且无任何能力提升的价值。如每天登陆数据库定期巡检、根据固定格式编写巡检报告,如在做运维操作时,将CRT中内容复制到TXT中留存,如重复的连接VPN,如阅读英文材料时,复制英语到欧陆词典中翻译等等,这些重复的动作其实都可以通过自动化的脚本和工具来完成。自动化难的不是技术,而是工作的习惯或者使用者是否有意愿去改变,就如在Oracle数据库ADG切换一样,明明有一键切换的脚本可以完成ADG切换和切换过程中常见故障处理、切换前后环境检查,但是始终有人喜欢用传统的命令行去切换,认为人工巧命令的方式更安全,并且切换前后无体系化的巡检和确认,导致偶尔的切换失败,给自己操作名义上的损失,给公司、客户、甲方接口人造成经济上的损失。

1.2 自动化的价值

自动化就是将一连串的操作通过工具或者脚本加上逻辑判断来实现自动执行,毋庸置疑可以提升我们执行的效率,但是核心价值是标准化、流程化、异常情况判断和处理,降低工作的故障率和减少运维成本(包括人员能力成本)。通过自动化的方式,可以复制到多套系统,可以使小白通过自动化来完成原来只有专家才能完成的工作。想要看一个人负责的系统自动化的程度,其实可以观察系统负责人平时操作是否愿意通过工具或者脚本来提升效率。

1.3 自动化的误区

自动化的目的是利用自动化的价值来为我们服务,千万别为了自动化化而自动化,否则只会让整个运维体系更加复杂。这个时候可能运维的主体的知识还没有完全掌握时,还得去掌握自动化运维工具。此时,自动化并没有给创造价值,反而给我们带来了麻烦。就如需要实现Oracle数据库自动化安装、自动化升级补丁时,明明可以通过通过脚本完成或者使用一个微服务的模块就可以独立完成,但是偏偏要去搞一个自动化运维平台,平台做大了,功能做得多,但是每一个功能都没有做好,也失去了自动化运维平台的掌控能力。

2,个人电脑的自动化

下面我们就聊聊在自己的个人电脑上,怎么使用通过自动化来提升我们工作效率,由于我使用的MacOS系统,所以以MacOS为例,当然WIN系统也有类似的解决方案。那么今天的主角就是GUI Scripting(图形用户接口脚本),顾名思义就是通过鼠标或者键盘的操作GUI来生成脚本,自动完成工作。比如说,点击窗口中的某个按钮、获取窗口内特定区域的文本等等。这些可能单调繁琐的工作,你都可以用GUI Scripting 来完成,释放我们的双手。GUI Scripting不需要我们懂编程语言,只需要通过简单的几行命令和利用一些成熟的软件就可以帮助我们完成脚本的编写。话不多说,下面我们以欧陆词典翻译为例:选中一段文字后,触发快捷键、自动打开欧陆词典、选择翻译、复制到输入框、点击回车实现自动翻译,还可以实现翻译内容复制到剪切板后,再粘贴到任意的地方。

3,AppleScript的基础

前面提到AppleScript无需懂编程语言就可以开发自动化脚本,但是这里还是有几个基础知识需要我们完全掌握。

3.1,告诉系统做什么事情

AppleScript 的语法非常接近自然语言,想要操控一个应用(application)做某件事,只要直接tell它就好了,如下面激活Eudic.

tell application "Eudic" 
activate
end tell

也支持下面更简单的编写方式

tell application "Eudic" to activate

3.2 UI元素层级

这里引用网上的一张图片

自动化日常工作一:自动化概述和MacOS翻译自动化_MacOS

然而,如果想要用 tell 访问某一个 UI 元素,必须按上图中的层级结构,一层一层按顺序进行访问:System Events 是最外围的框架 → Eudic(具体某个应用)→ window 1(该应用的第1个窗口)→ button 1(窗口中的第1个按钮)。理解和掌握这种层级关系,是进行 GUI Scripting 非常关键的一步,刚开始时我们无法知道window 1,button 1分别是什么,这个不用急,后面我们有工具自动帮我们定位这些信息。

System Events 是系统应用(application),要tell它做某事,AppleScript 要这么写,

tell application "System Events"
end tell

所有带UI结构的应用,都是System Events下的进程,包括Eudic。如果我要告诉Eudic做某事,因为它是套在System Events之内的,就要这么写

tell application "System Events"
tell process "Eudic"
end tell
end tell

再进一步,我们要控制 Eudic 的第一个窗口,就是

tel lapplication "System Events"
tell process "Eudic"
tell window 1
end tell
end tell
end tell

这里window后面是数字,如果是第一个窗口,可以直接用 first window,或者是当前窗口可以使用front window。

以此类推,你可以无限 tell 下去,将所有的UI元素层都可以遍历,直到做的具体操作我们需要控制的UI元素一般藏在比较深的层级中,它们的完整描述都很长。

3.3 菜单项

查看项,就是我们上图中最上面部分的软件菜单项,我们可以直接通过item来访问,如本图为微信的案例,通过脚本访问代理设置。

自动化日常工作一:自动化概述和MacOS翻译自动化_MacOS_02

显示的代码如下:

tell application "System Events"
tell process "WeChat"
click menu item "Proxy Settings..." of menu "WeChat" of menu bar 1
end tell
end tell

4,怎么查找UI

这部分是整个文章的重点,无法定位UI就无法定位我们要点击的内容,并且在一些复杂的环境中,定位UI非常麻烦,需要我们不断的去取重试,可能才能找对。在开始写脚本的时候定位UI会消耗大量的时间,但是当多尝试定位几次后,就非常的简单,下面我们介绍常用的几种定位的方法。当然我们也可以利用一些成熟的商业软件,可以快速的定位我们要操作的功能的路径。

4.1 脚本法

脚本法:AppleScript 获取某个区域内所有 UI 元素,通过两个单词 entire contents就可以实现,操作简单,但是如果UI层数比较多,需要每次的定位,非常麻烦,当然也可以通过循环的方式实现,这里还是以Eudic为例, 获取整个软件的UI:

tell application "System Events"
tell process "Eudic"
entire contents
end tell
end tell

4.2  通过Accessibility Inspector方法

Accessibility Inspector为apple推出的一个软件,安装xcode会自动安装,当然也可以通过google,单独下载。打开软件,在方框中选择要定位的软件,如下:

自动化日常工作一:自动化概述和MacOS翻译自动化_MacOS_03

再点击红色的点即可。此时鼠标再选中我们需要瞄点的内容,如翻译,此时 上面就会显示详细的信息,如下所示: 

自动化日常工作一:自动化概述和MacOS翻译自动化_Applescript_04

此时通过option+space来固定我们描点所描内容,这样就可以在Accessibility Inspector看到更多的详细信息,如下所所示:

自动化日常工作一:自动化概述和MacOS翻译自动化_MacOS_05

这里通过Hierarchy就可以看到,翻译是个button及它上层的关系。

4.3 商业软件

通过商业软件就更简单的,比如通过UI Browser等软件,可以快速的找到我们要操作的元素,下面还是以Eudic为例,如下所示:

自动化日常工作一:自动化概述和MacOS翻译自动化_MacOS_06

自动化日常工作一:自动化概述和MacOS翻译自动化_Applescript_07

自动化日常工作一:自动化概述和MacOS翻译自动化_MacOS_08

这里就可以得到翻译的button的位置了。

    

5,案例分析

以欧陆词典翻译为例:选中一段文字后,触发快捷键、自动打开欧陆词典、选择翻译、复制到输入款、点击回车实现自动翻译,还可以实现翻译内容复制到剪切板后,再粘贴到任意的地方。实现此需求的方法很多,最简单的是通过Eudic本身提供的字典功能就可以实现,为演示GUI的功能,这里特别采用GUI的方式来实现。这个案例中,为了减少AppleScript的编写难度,此时我们借助了keyboard maestro来实现粘贴复制和执行AppleScript脚本,也可以直接利用系统自带的自动化或者全部通过AppleScript来实现。

5.1  AppleScript脚本实现核心功能 核心的AppleScript脚本如下:

tell application "Eudic" to activate
tell application "System Events"
tell application process "Eudic"
click button "翻 译" of toolbar 1 of front window
end tell
end tell

整个km的脚本截图如下:

自动化日常工作一:自动化概述和MacOS翻译自动化_MacOS_09

5.2 全部利用KM实现

其实上面GUI Scripting这些功能目前在KM里面基本已经帮我们实现了,可以可以直接利用KM就可以实现,如下所示:

自动化日常工作一:自动化概述和MacOS翻译自动化_MacOS_10