数据网格内容与UI自动化和.net

本文关键字:UI 自动化 net 数据网 网格 数据 | 更新日期: 2023-09-27 18:18:14

我在使用UI自动化的外部应用程序中读取Datagrid的内容时遇到了一些麻烦,可以使用一些指针。以下是目前为止的内容:

int id = System.Diagnostics.Process.GetProcessesByName("Book")[0].Id;
AutomationElement desktop = AutomationElement.RootElement;
AutomationElement bw = desktop.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.ProcessIdProperty, id));
AutomationElement datagrid = bw.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.AutomationIdProperty, "lv"));
AutomationElementCollection lines = datagrid.FindAll(TreeScope.Children, new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.DataItem));
AutomationElementCollection items = lines[1].FindAll(TreeScope.Children, new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Custom));
GridItemPattern pattern = items[1].GetCurrentPattern(GridItemPattern.Pattern) as GridItemPattern;
TableItemPattern tablePattern = items[1].GetCurrentPattern(TableItemPattern.Pattern) as TableItemPattern;

这工作在尽可能多,我可以访问列id和行id从GridItemPattern和TableItemPattern,但我如何访问值是在那个特定的单元格?这可能吗?

谢谢。

数据网格内容与UI自动化和.net

我认为你需要使用ValuePattern。就像这样:

ValuePattern pattern = items[0].GetCurrentPattern(ValuePattern.Pattern) as ValuePattern;
string value = pattern.Current.Value;

我终于弄明白了,它需要使用CacheRequest来请求AutomationElement上的Name属性。下面是最后的代码:

var cacheRequest = new CacheRequest
{
    AutomationElementMode = AutomationElementMode.None,
    TreeFilter = Automation.RawViewCondition
};
cacheRequest.Add(AutomationElement.NameProperty);
cacheRequest.Add(AutomationElement.AutomationIdProperty);
cacheRequest.Push();
var targetText = loginLinesDetails[i].FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.ClassNameProperty, "TextBlock"));
cacheRequest.Pop();
var myString = targetText.Cached.Name;

我不熟悉AutomationElement类,但我过去曾使用AutoIT来自动化一些简单的windows内容(查找对话框,单击按钮等),它很容易。你可以考虑一下。下载包含一个。dll,你可以从。net解决方案中引用。

我不确定如果外部应用程序是一个WinForm网格或不是,但这里是一个ASP。网网格示例:http://www.autoitscript.com/forum/topic/13709-how-to-get-the-contents-of-datagrid-control/

然后,如果你是从网上抓取信息,我会推荐WatiN或Selenium

你可以尝试在一个元素上使用RawViewWalker来获取原始值(在controlview上,你可能无法获得几个属性)