Мне нужно автоматизировать общие действия для нескольких программ, таких как Microsoft Word. Испытания проводятся не для коммерческого использования, а для регрессионного тестирования.Visual Studio (C#) - Имитация кнопки Win32 Нажмите
До сих пор я просто двигал мышью и посылал левую кнопку мыши над кнопкой. Однако наша программа проверяет, что кнопка находится в состоянии «нажата». Когда автоматизация прижимает кнопку с помощью мыши, кнопка не нажата (кнопка не «утонуть»)
Почему? Как заставить автоматический щелчок мыши вызвать кнопку «Пресса», как обычный щелчок мыши?
В этом случае, BTW, я имею в виду кнопку «Сохранить» на панели быстрого доступа.
Код, который я использую, довольно прост - сначала я нахожу объект, на который я хочу нажать, а затем этот код используется;
public void MouseClick(params string[] args)
{
AutomationElement automationElement = elementUtils.FindObjectFullPath(args[1], args[4], args[5]);
string action = args[args.Length - 1];
if (automationElement == null)
return;
FocusApplicationExp(automationElement);
try
{
int x = (int)automationElement.GetClickablePoint().X;
int y = (int)automationElement.GetClickablePoint().Y;
MouseMoveExp(x, y);
MouseAction(action, automationElement);
}
catch (Exception)
{
Console.WriteLine("Failed to get clickable point for " + automationElement.Current.Name + " - Trying to get coordinates of bounding rectangle");
tl.AddLine("Failed to get clickable point for " + automationElement.Current.Name + " - Trying to get coordinates of bounding rectangle");
res.AddLine("Failed to get clickable point for " + automationElement.Current.Name + " - Trying to get coordinates of bounding rectangle");
int x = (int)(automationElement.Current.BoundingRectangle.Right - automationElement.Current.BoundingRectangle.Width/2);
int y = (int)(automationElement.Current.BoundingRectangle.Bottom - automationElement.Current.BoundingRectangle.Height/2);
MouseMoveExp(x, y);
MouseAction(action, automationElement);
return;
}
}
private void MouseAction(string action, AutomationElement automationElement)
{
switch (action)
{
case "Left":
Console.WriteLine("Left clicking on: " + automationElement.Current.Name);
tl.AddLine("Left clicking on: " + automationElement.Current.Name);
AutomationUtility.DoMouseClick();
res.AddLine("Left clicked on: " + automationElement.Current.Name);
break;
case "Right":
Console.WriteLine("Right clicking on: " + automationElement.Current.Name);
tl.AddLine("Right clicking on: " + automationElement.Current.Name);
AutomationUtility.DoMouseRightClick();
res.AddLine("Right clicked on: " + automationElement.Current.Name);
break;
case "Double":
Console.WriteLine("Double clicking on: " + automationElement.Current.Name);
tl.AddLine("Double clicking on: " + automationElement.Current.Name);
AutomationUtility.DoMouseDoubleClick();
res.AddLine("Double clicked on: " + automationElement.Current.Name);
break;
default:
break;
}
}
public static void DoMouseClick()
{
Mouse.Click(MouseButton.Left);
}
И я сделал попробовать несколько вариантов, например, давая некоторую задержку между кнопкой вниз и вверх, в случае произошло событие, но слишком быстро. Но кнопка никогда не входит в состояние «нажата», даже если я держу кнопку нажатой (в автоматическом режиме, конечно)
Просто для того, чтобы быть более ясным - автоматизация работает, она нажата на кнопку, и она вызывает слово сохранить. Проблема здесь заключается в том, чтобы вызвать нажатие кнопки визуально (и программно, изменив ее состояние).
Я не уверен, что это что-то значит, но система, которая идентифицирует состояния и события кнопок, является «UX», а идентификатор на основе Win32 НАХОДИТ «как-то».
EDIT: Я читал на нем последние несколько дней, и все становится яснее. Автоматизация, которую я использую, основана на UIAutomation, но состояние кнопки «Pressed» - это состояние MSAA, которое не перемещалось по генерации UI-объектов UIAutomation, поэтому автоматизация на основе UIAutomation не вызывает это состояние. Другими словами, мне нужно найти способ использования кода UIAutomation для отправки сигналов MSAA в элементы UIAutomation (которые содержат интерфейс IAccessible). Проблема заключается в том, что она поддерживается только в другом направлении (посылают сигналы UIAutomation, маскированные как сигналы MSAA для элементов MSAA, которые не поддерживают сигналы MSAA-Only, такие как «Enter state Pressed»)
Как указано, вы никогда его не увидите, машина просто нажимает слишком быстро. Мы не можем видеть альтернативу, которую вы пробовали. Это не должно иметь значения для тестирования пользовательского интерфейса, все, что имеет значение, - это то, что * Word * видит щелчок мыши. –
Проблема в том, что наша программа (а не автоматизация) собирает события и использует их, чтобы узнать, было ли сделано действие. В этом случае мышь нажимает на кнопку с именем «Сохранить» и родительскую «Панель быстрого инструмента», состояние объекта: нажата, «Фокусируемая». Так что мне нужен автоматический музлик, чтобы работать как человек. –