携手创作,共同生长!这是我参加「日新方案 8 月更文应战」的第3天,点击查看活动概况
Slack 主动化示例 – 从一个途径抓取联络人列表
背景
最近,我需求监控一些slack频道的联络信息,但我没有API能够调用。所以我需求运用UI主动化来完成这个使命。 持续运用这个库 Clicknium,除了支撑像selenium这样的web主动化之外,它还支撑桌面主动化,这对我很有用。 你能够按照这个 Visual Studio Code 扩展的入门来设置环境,对我来说不到 2 分钟。
Slack 客户端主动化 – 抓取联络人列表
-
主动选择组和频道。 根据组名,主动点击左边导航栏:
我运用 Clicknium Recorder 在 slack 上记载 UI 元素,并运用参数 {{group}} 对其进行更新,如下所示,用于参数定位器,请参阅Clicknium 文档
我将窗口的标题设置为“Slack*”,由于 clicknium 支撑通配符匹配,它能够进步主动化定位的健壮性。 而且我将 tabitem 名称添加到参数”group”,然后我能够在运行阶段指定group。
from clicknium import clicknium as cc, locator, ui
ui(locator.slack.tabitem_group, {'group':group}).click()
- 与主动点击频道相似。
if not cc.is_existing(locator.slack.treeitem_channel, params):
ui(locator.slack.treeitem_parent).click()
ui(locator.slack.treeitem_channel, params).click()
由于有时频道列表被折叠,所以我查看方针频道是否存在,假如没有,需求先单击频道以结束频道列表。
- 经过获取右上角的信息文原本获取联络人计数,然后解析文本。
text = ui(locator.slack.text_all, params).get_text()
index = text.find("members")
count = int("".join(re.findall("\d+",text[0:index])))
- 经过单击右上角的信息显现联络人列表对话框。
- 由于联络人列表是动态加载的,所以我们抓取了将近 10 个项目,需求向下翻滚翻滚条来加载新联络人
for i in range(1,13):
dict = {"index":i}
if not cc.is_existing(locator.slack.listitem_member, dict):
continue
elem_member = ui(locator.slack.listitem_member, dict)
name = elem_member.get_text()
if NotContains(names, name):
names.append({'name':name,'email':'', 'postfix':''})
step += 1
if step % 100 == 0:
SaveToFile(names)
## move mouse down to trigger new data loaded for member list
ui(locator.slack.edit_membername).click(by='mouse-emulation')
for i in range(10):
cc.send_hotkey("{DOWN}")
我单击查找成员编辑框,然后发送快捷键”DOWN”十次,它将触发加载新联络人。 为了获取每个成员名称,我运用以下参数定位器:
Slack 客户端主动化 – 抓取联络人详细信息
在上面的部分中,我展现了怎么从频道中抓取联络人列表,在本部分中,我展现了怎么抓取每个联络人的详细信息,例如电子邮件地址。 (假如频道没有显现电子邮件地址,您能够越过此部分)。
- 与上述部分相同,主动选择组和频道。
- 经过单击右上角的信息显现联络人列表对话框。
- 输入联络人姓名查找联络人
ui(locator.slack.text_all, params).click()
ui(locator.slack.edit_membername).set_text(item['name'], "set-text")
- 假如匹配,单击以显现联络人的个人资料,然后获取电子邮件文本 要单击查找成果,我运用以下定位器, 运用参数”name”设置名称并取消选中 listitem 层。
- 本节中的错误处理:
- 假如查找失利,需求封闭对话框并迭代到下一个联络人。
- 假如无法获取电子邮件信息,需求封闭个人资料选项卡并迭代到下一个联络人。
member1 = cc.wait_appear(locator.slack.listitem_member1, {'name':item['name']})
if member1 != None:
member1.click()
else:
print("failed to search the member")
item['email'] = "ignore"
item['postfix'] = ""
ui(locator.slack.image).click()
continue
try:
email = ui(locator.slack.text_email).get_text(timeout=5)
item['email'] = email
item['postfix'] = email.split('@')[1]
except:
print("failed to find the email")
item['email'] = "ignore"
item['postfix'] = ""
if cc.is_existing(locator.slack.image):
ui(locator.slack.image).click()
continue
开源代码
我把代码放在我的github上,假如需求查看完整代码,请参阅github。