2016-12-14 32 views
0

我正在使用TestStack White來自動化Telerik Winforms應用程序中的測試場景。TestStack白色性能變慢並且加速

該應用程序有很多元素,如果我直接搜索一個元素,運行只會過時,永遠不會結束。

所以我做了手動層次結構搜索以挖掘元素級別以保存性能並使其工作。

然後,代碼看起來不太整潔,因爲我大量使用foreach自己做循環。

這是正確的方式來應付性能,或者我們有更好的方法來使用TestStack White時,有很好的代碼和良好的性能?

乾杯:

[TestMethod] 
    public void TestMethod1() 
    { 
     CoreAppXmlConfiguration.Instance.RawElementBasedSearch = true; 
     CoreAppXmlConfiguration.Instance.MaxElementSearchDepth = 2; 
     var applicationDirectory = "D:\\Software\\ABC Handling System"; 
     var applicationPath = Path.Combine(applicationDirectory, "ABCClient.GUI.exe"); 
     Application application = Application.Launch(applicationPath); 
     Thread.Sleep(5000); 
     Window window = application.GetWindow("[AB2] - ABC Handling System 2 - [Entity Search]", InitializeOption.NoCache); 
     ListBox listbox = window.Get<ListBox>(); 
     ListItem dispatchButton = listbox.Items.Find(i=>i.Name.Equals("Display")); 
     dispatchButton.Click(); 
     Thread.Sleep(5000); 

     SearchCriteria sc = SearchCriteria.ByControlType(ControlType.Pane).AndIndex(3); 
     UIItemContainer groupbox = (UIItemContainer)window.MdiChild(sc); 

     UIItemContainer pane1 = null; 
     foreach (IUIItem automationElement in groupbox.Items) 
     { 
      if (automationElement.Name == "radSplitContainer1") 
      { 
       pane1 = (UIItemContainer)automationElement; 
       break; 
      } 
     } 

     UIItemContainer pane2 = null; 
     foreach (IUIItem automationElement in pane1.Items) 
     { 
      if (automationElement.Name == "splitPanel1") 
      { 
       pane2 = (UIItemContainer)automationElement; 
       break; 
      } 
     } 

     Table table = null; 
     foreach (IUIItem automationElement in pane2.Items) 
     { 
      if (automationElement.Name == "Telerik.WinControls.UI.RadGridView ; 247;14") 
      { 
       table = (Table)automationElement; 
       break; 
      } 
     } 

     TableRow row = table.Rows[9]; 
     string s = row.ToString(); 
    } 

回答

0

呀,而不是做循環自己,你只是將使用在每個檢索要素的獲取。奇怪的是,當我深入瞭解代碼時,它使用的是AutomationElement.FindFromPoint,我不確定它是如何遍歷樹來找到它的元素的。我會嘗試一下下面的代碼,看看它在應用程序中是多少還是少一些。

CoreAppXmlConfiguration.Instance.RawElementBasedSearch = true; 
CoreAppXmlConfiguration.Instance.MaxElementSearchDepth = 2; 
var applicationDirectory = "D:\\Software\\ABC Handling System"; 
var applicationPath = Path.Combine(applicationDirectory, "ABCClient.GUI.exe"); 
Application application = Application.Launch(applicationPath); 
Thread.Sleep(5000); 

Window window = application.GetWindow("[AB2] - ABC Handling System 2 - [Entity Search]", InitializeOption.NoCache); 
ListBox listbox = window.Get<ListBox>(); 
ListItem dispatchButton = listbox.Get<ListItem>(SearchCriteria.ByText("Display")); 
dispatchButton.Click(); 
Thread.Sleep(5000); 

UIItemContainer groupbox = window.MdiChild(SearchCriteria.ByControlType(ControlType.Pane).AndIndex(3)); 
UIItemContainer pane1 = groupbox.Get<UIItemContainer>(SearchCriteria.ByText("radSplitContainer1")); 
UIItemContainer pane2 = pane1.Get<UIItemContainer>(SearchCriteria.ByText("splitPanel1")); 
Table table = pane2.Get<Table>(SearchCriteria.ByText("Telerik.WinControls.UI.RadGridView ; 247;14")); ; 
TableRow row = table.Rows[9]; 
string s = row.ToString(); 

我得到一切從先前元素在試圖限制其掃描樹的一部分。從White的代碼中可以看出,除了減少前端鍋爐板的數量外,根據AutomationElement.FindFromPoint的性能,這可能沒有任何影響。

另外,ByText搜索條件通過調用CreateForName映射到AutomationElement的名稱屬性,這就是爲什麼我用ByText替換名稱的所有檢查。