【问题标题】:DocumentCompleted firing only onceDocumentCompleted 仅触发一次
【发布时间】:2014-05-15 06:05:59
【问题描述】:

我在表单中有一个 WebBrowser,我想用它做一些自动化操作。我单击 Windows 窗体内的一个按钮,该按钮命令 WebBrowser 的 Navigate 方法到某个页面。然后我在 DocumentCompleted 触发后自动单击一个链接,但之后我还想单击一个存在于通过单击该链接出现的新页面中的按钮。似乎 DocumentCompleted 仅在我单击 Windows 窗体中的按钮时才触发,而不是在我自动单击网页内的链接时触发。

    void BtnTestClick(object sender, EventArgs e)
    {
        webBrowser1.Navigate(@"https://play.google.com/apps/");
        webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(WebBrowser_DocumentCompleted);     
    }

    public void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {

        var webBrowser = sender as WebBrowser;
        //webBrowser.DocumentCompleted -= WebBrowser_DocumentCompleted;

        // test to see if we're on fist CONFIRM page then go forward by clicking
        var links = webBrowser1.Document.GetElementsByTagName("a");
        foreach (HtmlElement link in links)
        {
            if (link.InnerText == "Proceed anyway")
            {
                link.InvokeMember("click");
            }
        }   // this works

    webBrowser1.Document.GetElementById("gwt-uid-126").InvokeMember("click"); 
    }

link.InvokeMember("click"); 之后,网络浏览器中会加载一个新页面,该页面有一个我也想点击的按钮 (gwt-uid-126)

但它没有被点击。

我也试过了:

var elements = webBrowser1.Document.GetElementsByTagName("button");
foreach (HtmlElement file in elements)
{
    if (file.GetAttribute("class") == "GKYRWGTDNX GKYRWGTDLY")
    {
        file.Focus();
        file.InvokeMember("click");

    }
}   

没有运气!

【问题讨论】:

    标签: c# .net vb.net webbrowser-control


    【解决方案1】:

    据我所知,第二次单击不起作用,因为文档未完全加载并调用了第二次单击。

    您必须添加另一个处理第二个文档加载的 if-else 块。

    Edit1:当我回答这个问题时,我正在打电话,所以无法提供任何 sn-p。以下是您可以对WebBrowser_DocumentCompleted 方法进行的更改。

    var links = webBrowser1.Document.GetElementsByTagName("a");
    foreach (HtmlElement link in links)
    {
        if (link.InnerText == "Proceed anyway")
        {
            link.InvokeMember("click");
        }
    }
    // following is for the page that is loaded on click of link.
    var gwt_uid_126 = webBrowser1.Document.GetElementById("gwt-uid-126");
    if(gwt_uid_126 != null)
    {
        gwt_uid_126.InvokeMember("click");
    }
    

    您可能想检查在第二个页面加载时是否真的调用了 WebBrowser_DocumentCompleted 方法。这可能是第二次点击未注册的原因。

    【讨论】:

    • 您能说得更具体些吗? if-else 应该包含什么?不过,您是对的,当我观看 webBrosewer 控件 html 元素的绘图时,大约一秒钟后,我尝试单击的特定按钮出现在页面上。
    • 我在 DocumentCompleted 事件处理程序的开头放置了一个计数器,它的计数最多为 3;所以事件被触发了 3 次。我也再次尝试了您的代码,但没有成功。
    • 我单击“请继续”的部分原因是我在 web 控件中获得了“浏览器不支持”页面。单击后,即使我看到按钮和所有其他控件,我仍会在网页的左上角看到一条文字:“正在加载发生意外错误。请稍后再试。”也许这只是一个与我的按钮无关的 hancy shmanchy 图形 sn-p,...
    • 我用页面上另一个按钮的 id 更改了该按钮的 id,它可以工作。这个gwt_uid_126后来不知怎么生成的,不知道怎么捕捉
    【解决方案2】:

    将这部分代码移动到 Constructor 或 Form_Load 中:

    webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(WebBrowser_DocumentCompleted);
    

    试试这个,而不是使用 WebBrowserDocumnetCompletedEventHandler:

    void btnTestClick(object sender, EventArgs e)
    {
        webBrowser1.Navigate(@"https://www.google.com/");
    
        while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
            continue;
    
        var webBrowser = sender as WebBrowser;
        //webBrowser.DocumentCompleted -= WebBrowser_DocumentCompleted;
    
        // test to see if we're on fist CONFIRM page then go forward by clicking
        var links = webBrowser1.Document.GetElementsByTagName("a");
        foreach (HtmlElement link in links)
        {
            if (link.InnerText == "Proceed anyway")
            {
                link.InvokeMember("click");
            }
        }   // this works
    
        webBrowser1.Document.GetElementById("gwt-uid-126").InvokeMember("click"); 
    
    }
    

    【讨论】:

    • 嗨!在两个地方都试过了,没有变化。这是我用 IE 和 Chrome 都检查过的按钮的正确 ID。
    • 现在应用程序只是挂在那里什么都不做,甚至不加载网页。没有回应。
    • @kawa 这就是重点。 WebBrowserDocumentCompletedEventHandler 没有触发,因为页面没有完成。
    猜你喜欢
    • 2011-08-13
    • 2020-08-25
    • 2022-01-03
    • 1970-01-01
    • 2018-09-27
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多