0

我正在使用 WebBrowser 控件进行一些自动化测试。问题是偶尔 - 不是所有时间 - 当我测试上传图像时,文件上传对话框没有关闭,程序只是“挂起”并等待手动输入,这违背了整个自动化过程的目的。我想要做的是“强制”关闭对话框,但一直无法弄清楚。任何帮助或方向将不胜感激。

需要意识到的是,这段代码在某些时候有效,但并非所有时候都有效。我需要帮助弄清楚如何让这段代码一直工作。

这是代码:

    async Task PopulateInputFile(System.Windows.Forms.HtmlElement file, string fname)
    {
        file.Focus();

        // delay the execution of SendKey 500ms to let the Choose File dialog show up
        var sendKeyTask = Task.Delay(5000).ContinueWith((_) =>
        {
            // this gets executed when the dialog is visible
            //SendKeys.Send(fname + "{ENTER}");
            //PressKey(Keys.Space, false);
            SendKeys.SendWait(fname);
            PressKey(Keys.Enter, false);
        }, TaskScheduler.FromCurrentSynchronizationContext());

        file.InvokeMember("Click"); // this shows up the dialog

        await sendKeyTask;

        // delay continuation 500ms to let the Choose File dialog hide
        await Task.Delay(5000);
    }

    async Task Populate(string fname)
    {
        var elements = webBrowser.Document.GetElementsByTagName("input");
        foreach (System.Windows.Forms.HtmlElement file in elements)
        {
            if (file.GetAttribute("name") == "file")
            {
                this.Activate();
                this.BringToFront();
                file.Focus();
                await PopulateInputFile(file, fname);
                file.RemoveFocus();
            }
        }
    }
4

2 回答 2

1

好的,这就是解决方案。您必须使用 WIN API 来关闭窗口。我通过使用 SPY++ 找到了“选择要上传的文件”对话框的类名,结果是:#32770。

    [DllImport("user32.dll")]
    public static extern int FindWindow(string lpClassName,string lpWindowName);
    [DllImport("user32.dll")]
    public static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam);

    public const int WM_SYSCOMMAND = 0x0112;
    public const int SC_CLOSE = 0xF060;

    int iHandle = FindWindow("#32770", "Choose File to Upload");
    if (iHandle > 0)
    {
          // close the window using API        
          SendMessage(iHandle, WM_SYSCOMMAND, SC_CLOSE, 0);
    }
于 2013-10-08T08:02:35.377 回答
0

不是真正的答案,但它可能会在以后变成答案。是否使用确保焦点在 IE“选择要上传的文件”对话框内,当你这样做的时候SendKeys使用以下验证,将下面的代码Task.Delay(4000)放入您的ContinueWith并检查Debug.Print.

static class Win32
{
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern int GetWindowText(IntPtr hWnd, System.Text.StringBuilder lpString, int nMaxCount);

    [DllImport("user32.dll")]
    public static extern IntPtr GetForegroundWindow();
}

private async void Form1_Load(object sender, EventArgs ev)
{
    await Task.Delay(4000);

    var currentWindow = new System.Text.StringBuilder(1024);
    Win32.GetWindowText(Win32.GetForegroundWindow(), currentWindow, currentWindow.Capacity);
    Debug.Print("Currently focused window: \"{0}\"", currentWindow);
}
于 2013-10-08T06:37:21.807 回答