C#在webbrowser控件中单击一个javascript警告消息OK按钮

时间:2017-02-06 10:13:34

标签: javascript c# webbrowser-control alert

我在C#windowsform程序中使用webbrowser控件,该程序浏览网站的多个页面,然后使用网站中的某些表单进行交易。 (我尝试使用httpwebrequestwebclient执行此操作,但遇到了Cookie的困难,并复制了网站动态生成某些表单选择选项的一些方法。我决定使用webbrowser并利用它该网站的脚本 - 它不是我的网站。)

在最后一个步骤中,我到达一个页面,其中包含一个表单,其中站点在提交表单时在页面上运行验证脚本。如果用户输入了错误的信息,则会弹出一个警告。

但是当我在我的程序中导航到该页面时(在我给空字段赋值之前),我得到警报。当我使用Chrome,Firefox或IE手动执行此操作时,不会发生这种情况。但它发生在webbrowser中。我可以通过提交包含不验证信息的表单在常规浏览器中复制此内容 - 但在Web浏览器中,它会在我加载页面时发生。

我的目标是:

  1. 检测到弹出警报已出现并成为焦点。 (警报的名称是“来自网页的消息。”)

  2. 单击警报的“确定”按钮,让我的程序继续输入信息并继续完成该过程。

  3. 这里有几个与我类似的问题。我找到的最有希望的帖子有以下代码:

    [DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter,
    string lpszClass, string lpszWindow);
    
    [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
    private static extern IntPtr FindWindow(string lpClassName, string
    lpWindowName);
    
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam,
    IntPtr lParam);
        private void ClickOKButton()
        {
            IntPtr hwnd = FindWindow("#32770", "Message from webpage");
            hwnd = FindWindowEx(hwnd, IntPtr.Zero, "Button", "OK");
            uint message = 0xf5;
            SendMessage(hwnd, message, IntPtr.Zero, IntPtr.Zero);
        }
    

    这段代码有点超出了我对新手的理解 - 我尝试在新类中进行设置,然后实例化该类的对象,然后导航到相关页面,然后调用ClickOKButton方法。没工作。我还尝试将其包含在表单级别,然后在程序中运行ClickOKButton函数,我将导航到显示警报的页面。但它没有用。

    所以我有几个问题:

    1. 还有另一种解决警报弹出窗口的方法吗?

    2. 假设此代码有意义,我可以在调用此代码之前运行哪种条件测试(如何检查警报是否已出现?)

    3. 页面在上一页表单的InvokeMember("submit")命令后加载,即出现警报时。提交后我的代码中的下一步是一个documentcompleted事件处理程序,然后触发,然后完成新表单。在完成字段之前,几乎就像webbrowser正在提交表单一样。因此,我不知道在哪里插入此ClickOKButton代码。

    4. 在我发现的代码中我不理解的东西中,我不理解传递给FindWindow的“#32770”参数。我怎么知道这是否适合我的警报?

2 个答案:

答案 0 :(得分:0)

我编写了以下代码,它运行正常。创建的控制台应用程序是单击javasript Alert / confirm框的Ok按钮。

using System;
using System.Runtime.InteropServices;

namespace IE_Automation
{
public class IEPoppupWindowClicker
{
    [DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

    [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
    private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, int wParam, int lParam);
    private const int BM_CLICK = 0xF5;
    private const uint WM_ACTIVATE = 0x6;
    private const int WA_ACTIVE = 1;

    public void ActivateAndClickOkButton()
    {
        // find dialog window with titlebar text of "Message from webpage"

        var hwnd = FindWindow("#32770", "Message from webpage");
        if (hwnd != IntPtr.Zero)
        {
            // find button on dialog window: classname = "Button", text = "OK"
            var btn = FindWindowEx(hwnd, IntPtr.Zero, "Button", "OK");
            if (btn != IntPtr.Zero)
            {
                // activate the button on dialog first or it may not acknowledge a click msg on first try
                SendMessage(btn, WM_ACTIVATE, WA_ACTIVE, 0);
                // send button a click message

                SendMessage(btn, BM_CLICK, 0, 0);
            }
            else
            {
                //Interaction.MsgBox("button not found!");
            }
        }
        else
        {
            //Interaction.MsgBox("window not found!");
        }

    }
}
}

答案 1 :(得分:-1)

尝试使用

webBrowser.Document.ActiveElement.InvokeMember("click");

自动单击警报框。它对我有用。