У меня есть приложение, для которого я пытаюсь написать автоматический тест пользовательского интерфейса.Это родное C ++ ATL-приложение, которое имеет несколько элементов управления и панель меню.Клиентское приложение автоматизации, написанное на C #, может видеть строку меню, но без видимой причины, эквивалентное приложение, написанное на IronRuby, не может.
Моё консольное приложение C # может перечислять дочерние элементы главного окна, и оно видит MenuBar... Вот код
var desktop = AutomationElement.RootElement;
var walker = TreeWalker.RawViewWalker;
var mainWindow = desktop.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.NameProperty, "TheWindowName"));
var child = walker.GetFirstChild(mainWindow);
do
{
Console.WriteLine(child.Inspect());
child = walker.GetNextSibling(child);
}
while (child != null);
---- Output ----
<Static Name="view:" AutomationId="4337">
<Static Name="[ALL]" AutomationId="4341">
<Button Name="View" AutomationId="4322">
<AtlAxWinLic100 Name="" AutomationId="1101">
<ATL:msctls_statusbar32 Name="" AutomationId="StatusBar">
< Name="TheWindowName" AutomationId="TitleBar">
< Name="Application" AutomationId="MenuBar">
Однако, когда я пишу эквивалентный код с использованием IronRuby (v1.1.3), элементы управления TitleBar и MenuBar не отображаются!
desktop = AutomationElement.RootElement;
walker = TreeWalker.RawViewWalker;
mainWindow = desktop.FindFirst(TreeScope.Children, PropertyCondition.new(AutomationElement.NameProperty, "TheWindowName".to_clr_string));
child = walker.GetFirstChild(mainWindow);
until child.nil? do
Console.WriteLine(Inspect(child));
child = walker.GetNextSibling(child);
end
---- Output ----
<Static Name="view:" AutomationId="4337">
<Static Name="[ALL]" AutomationId="4341">
<Button Name="View" AutomationId="4322">
<AtlAxWinLic100 Name="" AutomationId="1101">
<ATL:msctls_statusbar32 Name="" AutomationId="6872212">
Как вы можете видеть, элементы со свойством ClassName пустой строки не отображаются (а также обратите внимание, что AutomationId в строке состояния отличается) ... но почему ????
Единственный код, который не показанздесь используется материал пространства имен ...
Есть идеи, что могло бы вызвать это?И мое приложение на C #, и IronRuby имеют единственный поток, который является STA, и ни один из них не вызывает CoInitializeSecurity, насколько я могу судить.
PS: Обычный ответ на эти вопросы - установить обновление автоматизации MS UI 3.0 для Windows.XP, Vista, server2003 и т. Д. Я работаю на Windows 7, и, насколько я знаю, нет обновлений UIA для Windows 7
PPS: Вот код для метода Inspect, который являетсяодинаково (достаточно близко) как для рубина, так и для C #
public static string Inspect(this AutomationElement element)
{
var className = element.GetCurrentPropertyValue(AutomationElement.ClassNameProperty);
var name = element.GetCurrentPropertyValue(AutomationElement.NameProperty);
var id = element.GetCurrentPropertyValue(AutomationElement.AutomationIdProperty);
return String.Format("<{0} Name=\"{1}\" AutomationId=\"{2}\">", className, name, id);
}