本文主要简单介绍了 Alfred 的功能,浏览器自动化工具 Selenium 的功能以及代码示例,最后介绍了如何编写一个简单的 Alfred Workflow 来提高工作效率。
Alfred 简介
Alfred 是 Mac 上的效率神器,有了它,你几乎可以用键盘完成一切工作。通过自定义配置,减少重复操作,可以做到 Don't Repeat Yourself。并且你可以免费使用基本功能。
基础命令
打开 Alfred 快捷键可以设置为 option space,大部分 Mac 的快捷键使用的是 command,设置成 option 可以避免冲突 在软件界面按上或者下能够选择高亮的项目,return 可以确定选择 使用 command 数字键 能够快速定位到某个项目 shift 可以预览(preview)文件
文件
open/空格 文件名:打开文件,如果使用 command⌘ return↵ 可以打开文件所在文件夹 find 文件名:打开文件所在文件夹 in 搜索内容:以内容搜索文件 tag 颜色:按照文件的 tag 搜索
剪贴板
将快捷键设置成 option C 打开剪贴板 使用 clear 命令能删除剪贴板里的所有内容 可以给文本、图片、文件列表设置不同的过期时间 在高级选项中可以设置忽略某些 App 的内容,比如苹果的密码串 KeyChain
代码片段
用来分类整理代码片段,比如查看端口号占用进程 也可以将需要经常使用的信息,比如报销信息,快递地址加入其中 还可以使用官方提供的一些包,比如 Mac 的按键
有一个常用的场景是使用 Alfred 搜索。Alfred 内置了非常多的搜索引擎。我们也可以通过自定义的方式加上一些,比如程序员常用的 Stack Overflow 和 GitHub,还有国内使用率最高的百度。可以通过下图方式添加搜索引擎。
其中,在 3 处需要输入的内容可以通过打开对应网站,输入关键字点击搜索获得对应的网址,然后将网址中搜索的关键字部分改为 {query} 即可。
Alfred 还有一些字典,计算器等功能,在此就不多赘述,需要的小伙伴可以自行探索。
Selenium 爬虫
日常每天会写一道算法题,需要将算法题目描述和代码从网站上复制粘贴下来。想着通过已经打开并且完成代码编写的浏览器页面的获取,找到了 Selenium 框架。
Selenium 是一个通过使用 WebDriver API 模拟人操作浏览器的网页实现自动化功能的框架,支持多种语言。我们可以使用 Selenium 来打开浏览器页面,点击选取浏览器上的元素,滚动页面,甚至还可以执行 javascript 脚本。下面以 Python 语言为例介绍使用 Selenium。
首先通过 pip 或者 IDE 等工具安装 Selenium,现在最新的版本为 4.6.0。然后需要将浏览器所在路径加入 PATH 中:
代码语言:javascript复制echo 'export PATH=$PATH:/path/to/driver' >> ~/.bash_profile
source ~/.bash_profile
新版本的 Selenium 不需要安装驱动(driver)即可使用。安装完成之后编写并运行以下代码检查是否安装成功。
代码语言:javascript复制from selenium import webdriver
browser = webdriver.Edge()
driver.get(r'https://www.baidu.com')
如果一切正常,Selenium 会打开一个新的浏览器并打开百度的页面。在这里由于我们需要控制一个已经打开的浏览器,所以可以使用开发者模式打开一个浏览器页面。打开 Terminal,并输入以下代码,会通过端口 9222 打开一个浏览器。
代码语言:javascript复制/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge --remote-debugging-port=9222
这样我们就可以使用 Selenium 来控制这个浏览器。只需要在初始化的时候加入 option 参数即可。
代码语言:javascript复制options = webdriver.EdgeOptions()
options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
browser = webdriver.Edge(options=options)
这样我们就控制了一个浏览器,可以通过 Selenium 来模拟人的操作获取需要的各种信息。下面介绍一些常用的操作:
定位元素
通过在浏览器按下快捷键 command shift C 来定位一个元素,找到元素之后右键选择 Copy Xpath 即可复制元素对应的路径。也可以使用别的元素属性,只要能唯一定位元素即可。
代码语言:javascript复制from selenium.webdriver.common.by import By
element = driver.find_element(By.CLASS_NAME, "class_name")
element = driver.find_element(By.ID, "id")
element = fruits.find_element(By.CLASS_NAME, "sub_element")
element = driver.find_element(By.CSS_SELECTOR, "#css_class")
elements = driver.find_elements(By.TAG_NAME, "tag_name")
elements = question.find_elements(By.XPATH, ".//p | .//pre | .//ul | .//img")
操作元素
代码语言:javascript复制element.click() # 点击
element.send_keys("selenium") # 模拟按键输入
element.clear() # 模拟清除输入
等待页面加载
有时候需要等待元素显示或者可点击时才能进行下一步操作。
代码语言:javascript复制from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
# 显式等待
program_list = WebDriverWait(browser, 5, 0.5).until(EC.presence_of_element_located((By.XPATH, 'xpath')))
# 隐式等待
browser.implicitly_wait(10)
# 检查元素是否可见
element.is_displayed()
# 检查元素是否可以操作
element.is_enables()
模拟按键
代码语言:javascript复制from selenium.webdriver.common.keys import Keys
# 删除
element.send_keys(Keys.BACK_SPACE)
# 回车
element.send_keys(Keys.ENTER)
# 全选
element.send_keys(Keys.COMMAND, 'a')
# 复制
element.send_keys(Keys.COMMAND, 'c')
执行 javascript 代码
代码语言:javascript复制# 执行 js 代码,将页面滚动到能看见 target 元素的位置
browser.execute_script("arguments[0].scrollIntoView();", target)
使用上述操作,基本上可以模拟人操作浏览器。需要获取相关脚本文件的可以点击阅读原文获取源代码链接。
Workflow
Workflow 既是 Alfred 的付费功能也是核心功能,有点类似【快捷指令】。通过编写可视化的组件,理论上可以进行所有有关 Mac 的操作。许多工作中需要重复的指令都可以通过 Workflow 做到简化。比如可以通过 HTTP Status Codes 快速查询对应响应码的含义。
这里简单地搭建了一个生成 markdown 的 Workflow。点击 Workflow 并选择新建一个 Workflow(Create a new Workflow)。
输入 Workflow 的名字,Bundle Id 使用域名的倒序,类似 Java 包路径的命名,然后填入作者的名字,点击保存即可。
在 Workflow 的编辑页面,使用 Hotkey 来触发(Trigger),快捷键设置为 option L,后面接着的是一个 Terminal,里面可以使用以下代码来执行 Python 脚本。
代码语言:javascript复制python3 /path/to/leetcode_maker.py
为了使终端执行完能够自动退出,设置了一个延迟触发,将在 10 秒之后输入 command W 关闭打开的 Terminal。
这样一个简单的 Workflow 就完成了。以后就可以专注在页面上写代码,只需要按下 option L 就能将代码的题目和已经写好的代码抓取下来,非常方便。