Why do I do this? (c) Sand dan Glokta
В последний раз строчки кода появлялись в этом блоге три года назад. А все по тому, что в какой-то момент написание этого самого кода (и не только) мне перестало быть интересным - даже наоборот. Настолько не интересно, что на домашнем компе у меня нет ничего связанного с программированием - ни Visual Studio, ни Eclipse, ни даже Notepad++. И вот, появилась "задача" поковырять возможность автоматизации под Windows Phone, а на рабочем ноуте - Mac OS... Короче, я как обычно работаю дома, а теперь еще и на домашнем компе - чего не было уже пару лет... Поставил Visual Studio (благо у меня есть лицензии на абсолютно все продукты майкрософт) и понеслась.
Итак, для всего этого дела мелкомягкие продвигают свою платформу - Coded UI, которая доступна с VS Premium либо Ultimate - которые стоят дофига денег. Этот самый Coded UI позволяет записывать действия пользователя и генерирует за него код... Много кода - раза в три-четыре больше, чем нужно. Если отбросить всю фигню, которую он генерирует и написать все самому, то простой клик на кнопку будет выглядеть как-то так:
XamlWindow myAppWindow = XamlWindow.Launch("17208ead-c62f-4331-a8e4-331db95756d7_z1ch1gk3zfafr!App");
XamlButton mUIClickedButton = new XamlButton(myAppWindow);
mUIClickedButton.SearchProperties[XamlButton.PropertyNames.AutomationId] = "btn1";
Gesture.Tap(mUIClickedButton);
Для работы нужно знать AutomationId вашего приложения (он в первой строке кода) и имена контролов (в примере это btn1). Работает замечательно, поддерживается как эмулятор, так и реальные девайсы. Вот только стоит дорого.
Попробовав отвязаться от Coded UI проекта, выяснилось что деплой теста и запуск приложения делаются неявным образом самой студией. Поэтому данный код, написанный в проекте другого типа не может запустить приложение... Ежели в файл проекта (.csproj который) добавить следующее:
[IsCodedUITest]True[/IsCodedUITest]
[TestProjectType]CodedUITest[/TestProjectType]
[IsWindowsPhoneCodedUITest]True[/IsWindowsPhoneCodedUITest]
то все чудесным образом начинает работать - вот только смысла в этом нет, т.к. это просто превращает проект в проект Coded UI (все равно нужна лицензия).
После этого я решил разобраться каким образом можно запускать и деплоить приложение на устройство или эмулятор (студия то это делать умеет). И тут оказалось, что майкрософт это не шибко-то и афиширует. Но решение все равно есть:
MultiTargetingConnectivity connectivity = new MultiTargetingConnectivity(CultureInfo.CurrentUICulture.LCID);
var devices = connectivity.GetConnectableDevices();
ConnectableDevice connectableDevice = devices[1];
IDevice iDevice = connectableDevice.Connect();
Guid appID = new Guid("{17208ead-c62f-4331-a8e4-331db95756d7}");
string applicationGenre = "NormalApp";
string xap = @"app1.xap";
IRemoteApplication remoteApplication = iDevice.InstallApplication(appID, appID, applicationGenre, "", xap);
remoteApplication.Launch();
Чтоб скомпилировать этот код, в проект нужно добавить две сборки: Microsoft.Smartdevice.Connectivity и Microsoft.Smartdevice.Connectivity.Interface. Их нужно искать на файловой системе - в списке доступных они не отображаются.
Данный код получает список всех доступных Windows Phone устройств (эмуляторов и реальных), выбирает одно из них, загружает на него приложение и запускает его. После этого я попробовал найти заветную кнопку btn1 и нажать на нее. Увы :).
Похоже на то, что единственный способ автоматизации это Coded UI. Есть еще сторонние платные тулы, но принцип их работы - тупо кликать по окну эмулятора, что слишком уж глупо и ненадежно.
Может быть решение и есть, но уж явно не на поверхности. Да и пофиг - мне все равно, завтра пойду отчитаюсь о результатах и забуду.
Ну вот, в кои то веки написал в этом блоге хоть что-то не слишком глупое. Не уверен, что ближайшие три года тут появится что-то подобное...
Комментариев нет:
Отправить комментарий