2011-12-17 23 views
5

के साथ डेटाग्रिड सामग्री मुझे UI ऑटोमेशन का उपयोग करके बाहरी एप्लिकेशन में डेटाग्रिड की सामग्री पढ़ने में कुछ परेशानी हो रही है और कुछ पॉइंटर्स का उपयोग कर सकता है।यूआई ऑटोमेशन और .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; 

यह रूप में ज्यादा में काम करता है के रूप में मैं GridItemPattern और TableItemPattern से स्तंभ आईडी और पंक्ति आईडी का उपयोग कर सकते, लेकिन मैं मूल्य कि विशेष सेल में है कि कैसे उपयोग करते हैं: यहाँ क्या मैं अब तक राशि है? क्या यह भी संभव है?

धन्यवाद।

उत्तर

1

मैं अंत में यह पता लगा है, यह CacheRequest के उपयोग की आवश्यकता अनुरोध करने के लिए AutomationElement पर नाम संपत्ति। यहां अंतिम कोड दिया गया है:

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

मुझे लगता है कि आपको इसके लिए ValuePattern का उपयोग करने की आवश्यकता है। बस ऐसे ही:

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

धन्यवाद, दुर्भाग्य से मुझे मूल्य पैटर्न को पकड़ने की कोशिश करते समय "असमर्थित पैटर्न" अपवाद मिलता है। यूस्पी केवल ग्रिडइटम और टेबलइटम को वैध पैटर्न के रूप में दिखाता है। कोई अन्य विचार? :) – ChrisO

+0

यह दुखद है = (मेरे परीक्षण अनुप्रयोग में सेल में प्रदर्शित मूल्य सेल के ऑटोमेशन एलेमेंट इंफॉर्मेशन एलिमेंट के नाम फ़ील्ड में भी शामिल था ('आइटम [1]। आपके नमूने के लिए। Current.Name') – Natalia

0

मैं AutomationElement कक्षाओं से परिचित नहीं हूँ, लेकिन मैं AutoIT का इस्तेमाल किया है कुछ सरल खिड़कियों सामान अतीत में (,, आदि एक संवाद को खोजने के लिए एक बटन क्लिक करें) स्वचालित करने के लिए और यह केक था। आप इसे मान सकते हैं। डाउनलोड में एक .dll शामिल है जिसे आप .NET समाधान से संदर्भित कर सकते हैं। http://www.autoitscript.com/forum/topic/13709-how-to-get-the-contents-of-datagrid-control/

फिर, अगर आप वेब से जानकारी स्क्रैप कर रहे हैं मैं WatiN की सिफारिश करेंगे:

मुझे यकीन है कि अगर बाहरी एप्लिकेशन एक WinForm ग्रिड है या नहीं, लेकिन यहाँ एक ASP.Net ग्रिड उदाहरण है नहीं कर रहा हूँ या Selenium

+0

अरे, मैंने उपयोग किया है अतीत में बहुत कुछ और ऑटोआईटीएक्स लाइब्रेरी में बहुत कुछ ऑटोटिट करें लेकिन मैं बाहरी ऐप में डेटा विंडो ऐप के साथ डेटाग्रिड भी नहीं देख सकता। मुझे लगता है कि यह एक रैपर में हर नियंत्रण के साथ एक डब्ल्यूपीएफ एप्लीकेशन है। कारण मैं चाहता था AutomationElement का उपयोग करें क्योंकि मैं UISpy के साथ डेटाग्रिड देख सकता हूं, इसलिए मुझे लगता है कि मूल्यों को खींचना संभव होगा, ऐसा लगता है कि यह मामला नहीं है। – ChrisO

0

आप कच्चे मूल्यों को प्राप्त करने के लिए (पर controlview आप कुछ गुण प्राप्त करने में सक्षम नहीं हो सकता है) एक तत्व पर RawViewWalker उपयोग करके देख सकते

+1

क्या यह MoMo के उत्तर पर एक टिप्पणी के रूप में है? – Flexo

संबंधित मुद्दे