среда, 10 августа 2011 г.

Если вы собираетесь эмулировать действия пользователя, убедитесь, что пользователь вообще смог бы их сделать

Это перевод If you're going to try to simulate user actions, make sure the user can do them. Автор: Реймонд Чен.

Многим людям нравится эмулировать действия пользователя программно. Я не собираюсь комментировать, является ли это вообще хорошей идеей; однако я хочу указать, что если вы всё же собираетесь это делать, то вам лучше бы быть уверенными в том, что вы эмулируете те вещи, которые пользователь на самом деле может делать.

К примеру, если вы хотите запустить поведение, как если бы пользователь щёлкнул по кнопке "закрыть" окна, то, прежде чем приступать к эмуляции действий пользователя, вам нужно убедиться, что окно видимо (visible), доступно (enabled) и вообще имеет кнопку "закрыть"! Если вы не будете следовать этим правилам, то целевое приложение будет работать в "невозможных" условиях. Приложение могло заблокировать окно, чтобы его не прервали в важный момент работы. Программное закрытие окна в этот момент означает, что вы добавили в программу баг, который автор программы пытался избежать!

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

Бывают и более неявные условия. К примеру, вам может попасться программа, которая не обновляет свой статус, если её окно скрыто (либо его перекрывает другое окно, либо пользователь просто отключился от удалённой сессии). В этих условиях пользователь вообще не может взаимодействовать с программой, поэтому эмуляция подобных действий может привести к странному поведению программы или даже её вылету - потому что вы сделали что-то "невозможное" с точки зрения этой программы.

По первой ссылке программа пыталась сделать окно другой программы активным и вывести его на передний план, но она не проверяла, не было ли окно отключено, и даже - было ли оно вообще видимо! (и даже если оно было доступным и видимым, то у него мог быть установлен стиль WS_EX_NOACTIVATE).

Цель этого поста - не перечислить все возможные вещи, которые вам нужно проверять, когда вы эмулируете действия пользователя. Это - то, что вам нужно сообразить самому, исходя из того, что вы делаете, и размышления о том, какие обычно условия сопутствуют этим действиям.

1 комментарий:

  1. Анонимный29 мая 2012 г., 22:47

    Здравствуйте! Эмуляцию действий пользователя лучше запрещать? Dr.Web запрашивает это действие. Как поступить?

    ОтветитьУдалить

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.