Сегодня: 22 Янв 2018

Автоматическая рассылка сообщений через Skype при помощи TestComplete

TestComplete

Хочу поделиться с читателями штукой, которая спасла и спасает группе автотестеров кучу времени. Эта штука - автоматическая рассылка сообщений через Skype при помощи TestComplete.

 

    Для начала расскажу, зачем нам это вообще понадобилось. Помимо того, что наши автотесты проверяют продукты, мы используем их для того, что бы поддерживать т.н. стенды. Стенд собой являет фактически установленную версию продукта, которой пользуются разработчики, тестировщики и аналитики. Поддержка состоит в том, что продукт надо автоматом установить и в дальнейшем обновлять. Установка и обновление наших продуктов - задача далеко не тривиальная. Удивительно, но в 21-м веке сохранились продукты, которые не имеют инсталлера и поэтому автотестам приходится грамотно жонглировать архивами, дампами баз и кучей сторонних вспомогательных приложений. Само обновление одного стенда сейчас занимает около 15 минут, в особо тяжёлых случаях - до 40. Чаще всего обновление проходит для всех незаметно ночью, сразу после того, как завершается сборка продукта. Однако, если мы готовимся к выпуску, то за рабочий день может собираться до 15 сборок продукта и далеко не все из них позволяют удачно обновить стенд. Как только стенд начинает обновляться, он становится недоступен для всех его пользователей и в этот момент на группу автотестирования обрушивается шквал вопросов о том, что случилось, когда исправится, и куда надо жаловаться. Стендов продуктов несколько штук, а нас самих только трое и поддержка не является основным для нас занятием.

    Вполне ожидаемо, что мы не хотим тратить много времени и отвлекаться на объяснения. Надо как-то дать пользователям информацию о том, что стенд начал обновление, при этом единственное, как он может узнать, работает стенд или нет - это попробовать войти на него по https.

    Для уведомления пользователей мы смогли придумать только 2 способа:

  1. письмо на e-mail
  2. сообщние через instant messenger

    Оба эти способа не лишены недостатков. Первый нам показался слишком “тяжёлым” и не гарантировал, что пользователь перед тем, как задать нам вопрос пойдёт открывать почтовик. Второй способ не гарантировал того, что через несколько сообщений об обновлениях пользователю не надоест на них отвлекаться. Поразмыслив, идеальным для нас кандидатом на спаммера был “лёгкий” im с возможностью отключения уведомлений. Здравствуй, клиент Skype с “bookmarked chat” и “/alertsoff” :)

    Для того, чтобы подтвердить идею мы потратили 1.5 часа на разработку рассыльщика, который манипулировал ui Skype для отправки сообщений и неделю на наблюдения. Практика показала, что пользователи переставали задавать вопросы сразу после того, как были включены в чат, в который “спамил” TestComplete. Иными словами, it fucking works! :) 
    Настало время избавиться от ограничений, которые накладывало управление Skype-ом через ui и переписать всё на COM.

    После небольшого гугления находится ссылка на архив со специальной библиотекой: https://developer.skype.com/resources/Skype4COM.zip (возможно потребуется регистрация).
    Внутри архива находим замечательные skype4com.dll и skype4com.chm.
    Распаковываем это себе на машину, регистрируем dll:

regsvr32 skype4com.dll

Вчитываемся в chm полный примеров работы. Запускаем Skype, пробуем по-быстренькому отправить сообщение.

//Подключаемся к Skype
var skype = Sys.OleObject("Skype4COM.Skype");
//Отправляем сообщение, вместо some.user выберите ник того,
//кто вам больше всего не нравится в списке контактов
skype.SendMessage(“some.user”, “test”);

    При первой попытке подключения мы получаем в окне Skype вот такое сообщение:

    Естественно, быстренько даём TestComplete доступ.

   Доступ после этого можно и убрать или запретить. Это делается через меню в окне скайпа. [Инструменты -> Настройки], далее в окне настроек выбираем [Дополнительно -> Расширенные настройки], после этого внизу открывшейся панели видим ссылку “Контроль доступа программ к Skype”

    После получения доступа, Skype незамедлительно отправляет контакту сообщение:



    В принципе, на этом можно было бы и закончить, но у нас в для рассылки сообщений используется отдельный чат и SendMessage для отправки в него сообщения не подходит. Можно попробовать отказаться от чата и посылать каждому сообщение персонально, но что произойдёт в этом случае? Если нужно будет добавить очередного человека в рассылку, то надо будет сделать следующее:

  1.  Добавить его ник (он же Handle) в список рассылки где-то в конфигурационном файле или напрямую в код.
  2.  Запросить авторизацию у этого человека, находясь под аккаунтом, из-под которого будет идти рассылка.

    А что надо будет сделать в случае чата? Просто добавить контакт в чат, при этом сделать это можно из-под своего аккаунта. Поддержка рассылки через чат обойдётся дешевле - делаем.

    Ищем, как отправить сообщение в чат. Выясняем, что список чатов можно получить через поле Chats, но там по всей видимости хранятся истории всех происходивших чатов, а нам нужен конкретный, сохранённый в списке. Находим поле BookmarkedChats - бинго!, оно-то нам и нужно. У него есть свойство Count и массив Item, а т.к. это было написано на Delphi, то индексация начинается с 1-го элемента. Как в этом списке найти нужный чат? Просматриваем все свойства, имеющиеся у каждого BookmarkedChat, находим то, что может нам помочь, заодно посмотрим, что там хранится на примере Skype-чата Московского сообщества тестировщиков ;)

  • String Blob : Returns chat global unique identifier

    60r0pPYeM_4Fsx-_iDbztZAlqR5hfw1RVyOGRhqRCCdTbWDtUnBNPF_GUsZ66E5vhUhtuTzepC6xxwtvnY1LLIOqeWgchO8EnnuvNG41KiiTFdJH6eimyw7C4w8IolIxqC_AV6Xz9FwM6aO9FcIlZ2A3RcuMuUsW_G30SizOFbd4IttcZNtmnr6WM7VPgjAkktLAzx5FsR1Fz9dgc4Uh6L43f3QuKw

  • String Name: Returns/sets chat name

    #ptitsina_viktoriya/$15b5bd8e30755291

  • String Topic: Returns chat topic

    Если мешают уведомления, отошлите в чат команду: /alertsoff. Включить их обратно: /alertson

    Чтобы однозначно определить нужный нам чат - подходит Blob, но в принципе, хватит и Name, если мы не собираемся добавлять в список контактов, с которого делаем рассылки толпу сохранённых чатов. А вот Topic нам подойдёт, если посмотреть на этот вопрос со стороны стоимости поддержки. Гораздо проще сразу через ui узнать/задать Topic, нежели выяснить, какой Blob или Name у чата. Работаем.

//Returns a bookmarked chat with specified 'topic'
function getBookmarkedChatByTopic(topic) {
  //Careful cause it's written in Delphi
  var bookmarkedChats = skype.BookmarkedChats;
  for (var i = 1 ; i <= bookmarkedChats.Count ; i++) {
    var chat = bookmarkedChats.Item(i);
    if (topic == chat.Topic) {
      return chat;
    }
  }
}

    Правим то, что делали в самом начале на это:

var skype = Sys.OleObject("Skype4COM.Skype");
var chat = getBookmarkedChatByTopic(“some topic”);
chat.SendMessage(“test”);

    А что будет, если мы попробуем отправить сообщение, но при этом клиент Skype будет закрыт? Хелп подсказывает, что всё упадёт и лучше так не делать, и Skype всё-таки лучше запускать. ok, ищем пример и находим его невероятно быстро, как всегда в skype4com.chm пример на VBScript - переписываем на JavaScript:

if (!skype) {
  skype = Sys.OleObject("Skype4COM.Skype");
  if (!skype.Client.IsRunning) {
    skype.Client.Start();
    skype.Attach(8, false);
  }
}

    И тут мы натыкаемся на грабли. После Start(). Надо делать цикл ожидания IsRunning, т.к. стартует оно не сразу. После Attach() надо делать цикл ожидания нужного AttachmentStatus. Практика показала, что пример из хелпа не выполнился ни единого раза, т.к. предлагаемый там AttachmentStatus не был похож, на то, что нужно. После всего этого надо ещё подождать соответсвующий ConnectionState и только после этого можно отправлять сообщения. Приводить код сразу не буду - его можно будет скачать по ссылке в конце статьи. Теперь интересные грабли с закрытием Skype. Закрывается он для хорошего im ДОЛГО. Т.е. с момента нажатия на кнопку Закрыть до непосредственно закрытия проходит ~10 секунд. При этом IsRunning уже false, но процесс ещё висит. Вроде бы как на этом грабли заканчиваются.

Т.к. желания утаивать код нет никакого, то он был выложен на github. Оттуда вы можете забрать его себе, сделать полезные изменения и использовать во благо своего проекта.

https://github.com/krainevsky/core_process_skype

  • debugx123

    Отправлено 2011-12-14 13:04:26

    Отличная статья!



Вы здесь: Главная События Статьи Автоматизация Автоматическая рассылка сообщений через Skype при помощи TestComplete