AutoIT, или нажатие кнопки User32 работает время от времени - PullRequest
4 голосов
/ 09 февраля 2012

Я пытаюсь автоматизировать тестирование приложения, и я застрял в проблеме, которую я пытаюсь устранить.

Приложение имеет стандартные кнопки Windows, и я пытался си AutoIT и User32 DLL, чтобы нажать на некоторые из этих кнопок.Иногда кнопки нажимаются правильно (ууу!), А иногда они терпят неудачу (бу!) - но, что еще хуже, AutoIT убежден , что он нажал кнопку (двойная бу!), Которая затем генерирует ложные срабатывания (трипл-бух!).Когда я убедился, что он убежден, я имею в виду, что он возвращает успешное нажатие, когда оно не было.

Я запускаю приложение на Win Server 2K8, в этом приложении нет ничего особенного, кроме того, что оно используетОкна MDI, а некоторые кнопки содержатся в окнах MDI.Однако некоторые из них не находятся в окнах MDI (например, в окне входа в систему до создания родительского окна).

Вот мой порядок команд:

Найти кнопку в окне (успех,всегда) Вывести окно на передний план (успех). Активировать окно (успех). Активировать кнопку (успех). Фокусировать кнопку (успех). Если кнопка находится в фокусе и кнопка включена, нажмите ее.(Успех / Неудача, непредсказуемое поведение. Я не могу понять, почему иногда это удается, а почему иногда не получается ...)

Другие детали:

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

Я работаю от имени администратора, а UAC полностью отключен.

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

И, как я уже говорил, я также пробовал это с помощью простого User32 / SendMessageвызов, и это также не удается.

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

Есть мысли?

ОБНОВЛЕНИЕ

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

Я пробовал это на другой виртуальной машине, и она также, кажется, работает там.Что касается двух виртуальных машин, они используют одну и ту же версию Windows, ту же версию моего приложения, ту же версию AutoIT и т. Д.

Я сократил ее до одной детали - которая, так какповезло бы это, я не могу настроить себя, и должен положить в билет, чтобы изменить любую конфигурацию.Разница в конфигурации заключается в следующем:

На виртуальной машине, которая не работает , диспетчер устройств показывает мышь, которая является мышью VMware.На виртуальной машине, которая работает , диспетчер устройств показывает мышь, которая является мышью PS / 2.Очевидно, что обе являются программными мышами, но мне интересно, может ли мышь VMWare работать по-разному и не всегда срабатывать при нажатии кнопок.Я не уверен, насколько вероятно, что это как решение, потому что, насколько я понимаю, использование вызова User32 SendMessage на самом деле не использует мышь, а вместо этого отправляет то же сообщение, которое отправила бы мышь, но оно того стоит...

Ответы [ 3 ]

2 голосов
/ 15 февраля 2012

Вы говорите, что успешно Focus изменили кнопку, поэтому вы пытались отправить событие Spacebar вместо MouseClick?

Send("{SPACE}")

(я думаю, что это синтаксис. Я на самом деле не обычный AutoIt)

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

Что касается определения того, что кнопка нажата, возможно, проще всего было бы сделать так, чтобы кнопка внесла изменения в форму, которую AutoIT может обнаружить. Например, метка состояния, которая читает Ready, пока пользователь не нажмет кнопку. Когда пользователь нажимает кнопку, текст меняется на Processing. При необходимости вы можете сделать метку невидимой (или расположенной за пределами формы), так что пользователь не сможет ее увидеть, а AutoIt сможет.

0 голосов
/ 08 июня 2012

Возможно, вам удалось решить эту проблему к тому времени, когда вы опубликовали этот вопрос, но пока нет хорошего ответа, поэтому я опубликую свой:

У меня была такая же проблема на виртуальной машине под управлением Windows Server 2008 R2: я не мог отправить нажатие клавиши или что-либо сделать через Win32 API SendMessage для определенной программы (и ее главного окна).

Согласно этому Q / A , это проблема UIPI (которая существует со времен Windows Vista). Вы должны просто отключить UAC, чтобы решить эту проблему. Я проверил это, и это работает. Другие альтернативы можно найти по указанной мной ссылке.

0 голосов
/ 20 февраля 2012

Я смоделировал ваш случай, и он работает на 100% на Windows 7 :

using System.Runtime.InteropServices;

[DllImport("user32.dll", SetLastError = true)]
static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);

void ClickFocusedControl()
{
    const uint KEYEVENTF_EXTENDEDKEY = 0x1;
    const uint KEYEVENTF_KEYUP  = 0x2;

    keybd_event(13, Convert.ToByte(0), KEYEVENTF_EXTENDEDKEY, UIntPtr.Zero); //Generates a KEY_DOWN
    keybd_event(13, Convert.ToByte(0), KEYEVENTF_KEYUP, UIntPtr.Zero); // Generates a KEY_UP
}
...