携手创作,共同生长!这是我参加「日新方案 8 月更文应战」的第3天,点击查看活动概况

Slack 主动化示例 – 从一个途径抓取联络人列表

背景

最近,我需求监控一些slack频道的联络信息,但我没有API能够调用。所以我需求运用UI主动化来完成这个使命。 持续运用这个库 Clicknium,除了支撑像selenium这样的web主动化之外,它还支撑桌面主动化,这对我很有用。 你能够按照这个 Visual Studio Code 扩展的入门来设置环境,对我来说不到 2 分钟。

Slack 客户端主动化 – 抓取联络人列表

  • 主动选择组和频道。 根据组名,主动点击左边导航栏:

python自动化神器专题3:slack自动化, 最好用的桌面自动化开发工具

我运用 Clicknium Recorder 在 slack 上记载 UI 元素,并运用参数 {{group}} 对其进行更新,如下所示,用于参数定位器,请参阅Clicknium 文档

python自动化神器专题3:slack自动化, 最好用的桌面自动化开发工具

我将窗口的标题设置为“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()

由于有时频道列表被折叠,所以我查看方针频道是否存在,假如没有,需求先单击频道以结束频道列表。

python自动化神器专题3:slack自动化, 最好用的桌面自动化开发工具

  • 经过获取右上角的信息文原本获取联络人计数,然后解析文本。

python自动化神器专题3:slack自动化, 最好用的桌面自动化开发工具

text = ui(locator.slack.text_all, params).get_text()
index = text.find("members")
count = int("".join(re.findall("\d+",text[0:index])))
  • 经过单击右上角的信息显现联络人列表对话框。

python自动化神器专题3:slack自动化, 最好用的桌面自动化开发工具

  • 由于联络人列表是动态加载的,所以我们抓取了将近 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”十次,它将触发加载新联络人。 为了获取每个成员名称,我运用以下参数定位器:

python自动化神器专题3:slack自动化, 最好用的桌面自动化开发工具

Slack 客户端主动化 – 抓取联络人详细信息

在上面的部分中,我展现了怎么从频道中抓取联络人列表,在本部分中,我展现了怎么抓取每个联络人的详细信息,例如电子邮件地址。 (假如频道没有显现电子邮件地址,您能够越过此部分)。

  • 与上述部分相同,主动选择组和频道。
  • 经过单击右上角的信息显现联络人列表对话框。
  • 输入联络人姓名查找联络人
ui(locator.slack.text_all, params).click()
ui(locator.slack.edit_membername).set_text(item['name'], "set-text")
  • 假如匹配,单击以显现联络人的个人资料,然后获取电子邮件文本 要单击查找成果,我运用以下定位器, 运用参数”name”设置名称并取消选中 listitem 层。

python自动化神器专题3:slack自动化, 最好用的桌面自动化开发工具

  • 本节中的错误处理:
    • 假如查找失利,需求封闭对话框并迭代到下一个联络人。
    • 假如无法获取电子邮件信息,需求封闭个人资料选项卡并迭代到下一个联络人。
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。