2011-12-17 13 views
5

Ho difficoltà a leggere il contenuto di un Datagrid in un'applicazione esterna utilizzando l'automazione dell'interfaccia utente e potrebbe utilizzare alcuni indicatori. Ecco quello che ho finora:Contenuto di Datagrid con UI Automation e .net

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; 

Questo funziona in quanto posso accedere gli ID delle colonne e gli ID Linea della GridItemPattern e TableItemPattern ma come faccio accedere al valore che è in quella cella specifico? È possibile?

Grazie.

risposta

1

ho finalmente capito questo, si richiede l'uso di CacheRequest per richiedere il Nome proprietà su AutomationElement. Ecco il codice finale:

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; 
0

Penso che sia necessario utilizzare ValuePattern per questo. Proprio così:

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

Grazie, sfortunatamente ottengo un'eccezione "Motivo non supportato" quando provo ad afferrare il modello di valore. UISpy mostra solo GridItem e TableItem come pattern validi. Altre idee? :) – ChrisO

+0

Questo è triste = (Nella mia applicazione di test il valore visualizzato nella cella era contenuto anche nel campo Nome dell'elemento AutomationElementInformation della cella ('items [1] .Current.Name' per il tuo campione) – Natalia

0

Non ho familiarità con le classi AutomationElement ma ho usato AutoIT per automatizzare alcune semplici cose finestre in passato (trovare una finestra di dialogo, fare clic su un pulsante, ecc) ed era la torta. Potresti considerarlo. Il download contiene una DLL che puoi fare riferimento a una soluzione .Net.

non sono sicuro se l'applicazione esterna è una griglia WinForm o no, ma qui è un esempio di griglia ASP.Net: http://www.autoitscript.com/forum/topic/13709-how-to-get-the-contents-of-datagrid-control/

Poi di nuovo, se si sta raschiando le informazioni dal web mi sento di raccomandare WatiN o Selenium

+0

Ehi, ho usato AutoIT abbastanza molto nel passato e un po 'della libreria AutoITX ma non riesco nemmeno a vedere il datagrid nell'app esterna con la sua app Window Info. Penso che sia un'applicazione WPF con ogni controllo in un wrapper. utilizzare AutomationElement era perché posso vedere il DataGrid con UISpy, quindi ho pensato che sarebbe stato possibile tirare i valori, sembra che non sia questo il caso però. – ChrisO

0

puoi provare a utilizzare RawViewWalker su un elemento per ottenere valori grezzi (on ControlView si potrebbe non essere in grado di ottenere alcune proprietà)

+1

è inteso come un commento alla risposta di MoMo? – Flexo