我有以下两种方法,我按顺序调用(顺序具有适当的类级别字段)
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行,然后在两种情况下都花费过多的时间。
(White似乎可能会在内部推迟执行Application.Attach
,但我对这个工具知之甚少,所以这对我来说非常不透明。)
第二次更新:
这里是在GetWindow()方法中花费的时间的细分。该应用程序在GetWindow()中花费了大约10%的时间,因此超过一半的时间花在WaitTillFound()上,而几乎所有这些都花在了Retry()方法中。有关如何减少时间的任何想法(或减少在找到Window构造函数后花费的时间)?
答案 0 :(得分:1)
目前尚不清楚在等待之后是否真正找到了目标窗口。如果是的话 - 这确实是非常奇怪的行为。无论如何,当你打电话给GetWindow时,White会尝试在一段时间内找到该窗口,默认为30秒(间隔为200ms)。所以很可能这就是你所经历的 - 白色由于某种原因无法找到你所针对的窗口。您可以通过以下方式配置此超时:
TestStack.White.Configuration.CoreAppXmlConfiguration.Instance.FindWindowTimeout = 0;
如果没有找到窗口,那么当它为0时,它将立即失败。您还可以使用低于30秒的其他值。