2016-03-17 270 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,它终于找到了窗口。然而,如果放慢超时方式导致它不行,我会有兴趣去看看。 –