2016-03-17 266 views
17

我有以下兩種方法,我在序列(按順序適當一流水平場)調用Application.GetWindow()*非常*慢

public const string ProcessName = "This is" 
public const string WindowTitle = "somewhat proprietary." 

public Application App { get; set; } 

public void Launch() 
{ 
    var theProcess = Process.GetProcesses().First(p => p.ProcessName.Contains(ProcessName)) 
    App = Application.Attach(theProcess); 
} 

public void Select() 
{ 
    var window = App.GetWindow(WindowTitle); 

    var textBox = window.Get<TextBox>(); 
    //etc, do more stuff in the window 
} 

當我運行它,調用App.GetWindow()需要真的很長時間。不止一分鐘。應用程序和窗口都已打開並正在運行。

我試過試過GetWindow()的過載,也試過撥打電話Application.GetWindows()Application.Find(),但是結果相同。

有沒有人有任何想法可以減少這個時間,或至少查明什麼花了這麼久?我沒有結婚,我的任何延伸的實施 - 不管是什麼讓我的窗口對象罰款與我。

更新:

爲了解決這個評論到目前爲止,我修改了代碼,以盡力消除許多其他問題成爲可能。

public void Select() 
{ 
    var processes = Process.GetProcesses().ToList(); 
    var process = processes.First(p => p.ProcessName.ToLower().Contains("notepad")); 
    App = Application.Attach(process); 
    var window = App.GetWindow("Untitled - Notepad"); 
} 

我拋出了可枚舉的評估,以消除任何推遲執行以及。而且,我用我的應用程序和記事本嘗試了它。上面的代碼,對於我的應用程序和記事本,立即在調試器中執行前3行,然後在這兩種情況下最後一行花費過多時間。

(看來有可能是白色可能會在內部推遲執行Application.Attach,但我不知道非常關注這個工具,所以這是非常不透明的我。)

第二次更新:

這裏的GetWindow()方法花費的時間細分。該應用程序在GetWindow()中花費了大約10%的時間,因此超過一半的時間花費在WaitTillFound()中,幾乎所有的時間都在Retry()方法中。關於如何減少這個時間的任何想法(或者減少在Window構造函數找到之後花費的時間)? Diagnostics

+1

什麼叫啓動?你確定這個應用程序沒有延遲Launch的調用,直到你調用GetWindow--你提供的代碼沒有顯示如何,但唯一應該運行緩慢的部分是你所有正在運行的進程的LINQ查詢,以查找包含指定的文本,這將需要查詢您的機器上每個正在運行的進程的信息。我無法從代碼中知道,也許你在某處使用await/async,並且在應用程序的值解決之前它不會調用Launch。 –

+2

你有沒有嘗試過與另一個應用程序?當我用'ProcessName =「notepad」'和'WindowTitle =「Untitled - Notepad」'運行你的代碼時,它幾乎立即返回窗口。 –

+0

我覺得用這裏的回覆更新帖子會更容易。對我來說,看起來很奇怪,它需要很長時間才能連接到記事本。另外,如果我使用Application.Launch(),GetWindow()非常快。不幸的是,我不適合我的應用程序。 –

回答

1

目前還不清楚在等待之後是否真的找到了目標窗口。如果是的話 - 這確實是非常奇怪的行爲。無論如何,當你調用GetWindow時,White會嘗試在一段時間內找到該窗口,默認30秒(間隔200毫秒)。所以最有可能的就是你所經歷的 - 由於某種原因,白色找不到你想要的窗口。您可以通過以下方式配置此超時:

TestStack.White.Configuration.CoreAppXmlConfiguration.Instance.FindWindowTimeout = 0; 

0如果找不到窗口,立即失敗。您還可以使用其他值小於30秒的值。

+0

這個超時位是一個幫助,當我回到我的開發機器時,肯定會玩這個。 FWIW,它終於找到了窗口。然而,如果放慢超時方式導致它不行,我會有興趣去看看。 –