我遇到了以下问题。我正在使用WatiN和C#来自动化Web UI应用程序的场景。
在我点击“打印”按钮的网页上,打开一个对话框窗口“将文件另存为”,我需要输入路径并单击对话框中的“保存”按钮。单击“打印”按钮后,浏览器将继续加载,直到我输入路径并通过对话框保存。
目前我做了什么:
使用WatiN,我尝试使用WatiN.Core.Native.Windows类来获取子窗口(将文件另存为对话框) - Parent将成为浏览器。当我尝试使用它时,我发现没有选项可以找到编辑文本框来发送路径。
System.IntPtr ptr = Utility.Browser.hWnd;
WatiN.Core.Native.Windows.Window mainWin = new WatiN.Core.Native.Windows.Window(ptr);
System.IntPtr childptr = WatiN.Core.Native.Windows.NativeMethods.GetChildWindowHwnd(mainWin.Hwnd, "#32770"); // #32770 is the class name , retrieved from Inspect.exe.
但我总是把childptr改为'0'。
使用UIAutomationClient,MS框架,下面是我的代码。
WatiN.Core.Native.Windows.Window windowMain = new WatiN.Core.Native.Windows.Window(NativeMethods.GetWindow(ptr, 5)); // ptr as declared and initialized above
TreeWalker trw = new TreeWalker(Condition.TrueCondition);
AutomationElement mainWindow = trw.GetParent(AutomationElement.FromHandle(ptr));
但是我被困在最后一行。我怀疑,这可能是因为浏览器在后台加载?
使用System.Windows.Forms.SendKeys,
System.Windows.Forms.SendKeys.SendWait("path");
// Gets stuck in above line after entering the path. Tried with only Send method, it says this method can not be used for this type of application.
System.Windows.Forms.SendKeys.SendWait("{ENTER}");
任何帮助都将受到高度赞赏。
感谢。
答案 0 :(得分:0)
我不熟悉watin,但我熟悉使用自动化元素的C#ui自动化。我可以使用此示例从Google Chrome获取保存对话框。
private void Button_Click(object sender, RoutedEventArgs e)
{
try
{
AutomationElement aeDesktop = AutomationLibrary.GetDesktop();
AutomationElement aeChrome =
AutomationLibrary.GetAutomationElement(
"Gmail - Verify your Disqus.com account - Google Chrome", aeDesktop);
List<AutomationElement> aeCollection = AutomationLibrary.GetAllAutomationElements(aeChrome);
foreach (AutomationElement ae in aeCollection)
{
System.Diagnostics.Debug.WriteLine(ae.Current.Name);
if (ae.Current.Name == "Save As")
{
List<AutomationElement> aeCollection2 = AutomationLibrary.GetAllAutomationElements(ae);
foreach (AutomationElement ae2 in aeCollection2)
{
System.Diagnostics.Debug.WriteLine(ae2.Current.Name);
}
return;
}
}
}
catch (UnableToFindAutomationElementException ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
}
GetAutomationElement和GetAllAutomationElements是我写的用来包装你需要用uiautomation做的所有树木行走的东西。下面是GetAllAutomationElement代码,如果您需要帮助,它应该非常容易用于获取单个元素。我花了一点时间才弄明白我将如何检索所有这些。
/// <summary>
/// Returns all children elements of an automation element.
/// </summary>
/// <param name="aeElement"></param>
/// <returns></returns>
public List<AutomationElement> GetAllAutomationElements(AutomationElement aeElement)
{
AutomationElement aeFirstChild = TreeWalker.RawViewWalker.GetFirstChild(aeElement);
List<AutomationElement> aeList = new List<AutomationElement>();
aeList.Add(aeFirstChild);
AutomationElement aeSibling = null;
int count = 0;
while ((aeSibling = TreeWalker.RawViewWalker.GetNextSibling(aeList[count])) != null)
{
aeList.Add(aeSibling);
count++;
}
return aeList;
}