如何在Web UI自动化中处理Windows对话框?

时间:2014-08-12 06:25:08

标签: c# watin ui-automation

我遇到了以下问题。我正在使用WatiN和C#来自动化Web UI应用程序的场景。

在我点击“打印”按钮的网页上,打开一个对话框窗口“将文件另存为”,我需要输入路径并单击对话框中的“保存”按钮。单击“打印”按钮后,浏览器将继续加载,直到我输入路径并通过对话框保存。

目前我做了什么:

  1. 使用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'。

  2. 使用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));
    

    但是我被困在最后一行。我怀疑,这可能是因为浏览器在后台加载?

  3. 使用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}");
    
  4. 任何帮助都将受到高度赞赏。

    感谢。

1 个答案:

答案 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;
    }