如何在 FlaUI 桌面自动化外观中处理多个 windows
How to handle multiple windows in FlaUI desktop automation-outlook
我是桌面自动化新手,FLaUI.I 正在使用 visual studio
我正在测试 Outlook 的插件。所以我可以点击新电子邮件,它会打开一个新的 window 用于撰写新电子邮件。
现在我想从我的主 window 切换到那个 window。我怎样才能做到这一点 ?
我当前的代码是:
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using FlaUI.Core;
using FlaUI.UIA3;
using FlaUI.Core.Conditions;
using FlaUI.Core.AutomationElements;
using System.Threading;
using FlaUI.Core.Tools;
using System.Diagnostics;
namespace Test_Project_for_SCDP
{
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
Process p = new Process();
p.StartInfo.UseShellExecute = true;
p.StartInfo.FileName = ("Outlook.exe");
p.Start();
System.Threading.Thread.Sleep(5000);
p.OutputDataReceived += (obj, args) => Console.WriteLine(args.Data);
var application = Application.Attach(p);
var window = application.GetMainWindow(new UIA3Automation());
Console.WriteLine("window is " + window.Title);
ConditionFactory cf = new ConditionFactory(new UIA3PropertyLibrary());
window.FindFirstDescendant(cf.ByName("New Email")).AsButton().Click();
System.Threading.Thread.Sleep(5000);
var window_child = application.GetMainWindow(new UIA3Automation());
Console.WriteLine("new window is " + window_child.Title);
window_child.FindFirstDescendant(cf.ByName("To")).AsTextBox().Enter("abcd");
//window.FindFirstDescendant(cf.ByName("Close")).AsButton().Click();
Console.WriteLine("Clicked and entered");
}
}
}
由于“新电子邮件”是一个新的 window,具有相同的 Process
ID,而不是您的第一个 child,您可能想这样做:
var app = FlaUI.Core.Application.Attach(process.Id);
using (var automation = new UIA3Automation())
{
var window = app.GetMainWindow(automation);
Console.WriteLine("window is " + window.Title);
ConditionFactory cf = new ConditionFactory(new UIA3PropertyLibrary());
var button1 = window.FindFirstDescendant(cf => cf.ByText("New Email"))?.AsButton();
button1?.Invoke();
var newWindow = app.GetAllTopLevelWindows(automation)[0];
//Do something with the newWindow variable
}
Process.Id
是您启动的进程的 属性,这是将进程附加到 Automation
object. 的方法之一
- 不使用
Click()
,而是按照 documentation; 的指示使用 Invoke()
newWindow
是windows的一个列表,所以你可以通过传入索引值[0]或者任何你想要的索引直接得到你想要的window。
我是桌面自动化新手,FLaUI.I 正在使用 visual studio 我正在测试 Outlook 的插件。所以我可以点击新电子邮件,它会打开一个新的 window 用于撰写新电子邮件。 现在我想从我的主 window 切换到那个 window。我怎样才能做到这一点 ? 我当前的代码是:
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using FlaUI.Core;
using FlaUI.UIA3;
using FlaUI.Core.Conditions;
using FlaUI.Core.AutomationElements;
using System.Threading;
using FlaUI.Core.Tools;
using System.Diagnostics;
namespace Test_Project_for_SCDP
{
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
Process p = new Process();
p.StartInfo.UseShellExecute = true;
p.StartInfo.FileName = ("Outlook.exe");
p.Start();
System.Threading.Thread.Sleep(5000);
p.OutputDataReceived += (obj, args) => Console.WriteLine(args.Data);
var application = Application.Attach(p);
var window = application.GetMainWindow(new UIA3Automation());
Console.WriteLine("window is " + window.Title);
ConditionFactory cf = new ConditionFactory(new UIA3PropertyLibrary());
window.FindFirstDescendant(cf.ByName("New Email")).AsButton().Click();
System.Threading.Thread.Sleep(5000);
var window_child = application.GetMainWindow(new UIA3Automation());
Console.WriteLine("new window is " + window_child.Title);
window_child.FindFirstDescendant(cf.ByName("To")).AsTextBox().Enter("abcd");
//window.FindFirstDescendant(cf.ByName("Close")).AsButton().Click();
Console.WriteLine("Clicked and entered");
}
}
}
由于“新电子邮件”是一个新的 window,具有相同的 Process
ID,而不是您的第一个 child,您可能想这样做:
var app = FlaUI.Core.Application.Attach(process.Id);
using (var automation = new UIA3Automation())
{
var window = app.GetMainWindow(automation);
Console.WriteLine("window is " + window.Title);
ConditionFactory cf = new ConditionFactory(new UIA3PropertyLibrary());
var button1 = window.FindFirstDescendant(cf => cf.ByText("New Email"))?.AsButton();
button1?.Invoke();
var newWindow = app.GetAllTopLevelWindows(automation)[0];
//Do something with the newWindow variable
}
Process.Id
是您启动的进程的 属性,这是将进程附加到Automation
object. 的方法之一
- 不使用
Click()
,而是按照 documentation; 的指示使用 newWindow
是windows的一个列表,所以你可以通过传入索引值[0]或者任何你想要的索引直接得到你想要的window。
Invoke()