WebBrowser OpenDialog自动化在.net中失败

本文关键字:失败 net OpenDialog 自动化 WebBrowser | 更新日期: 2023-09-27 18:03:37

我在网页加载到我的WebBrowser控件后按下一个按钮。我怎么知道它上膛了?我等了很长时间才确定。

下面是按钮代码的一个版本:

        var elementsx = webBrowser1.Document.GetElementsByTagName("input");
        foreach (HtmlElement file in elementsx)
        {
            if (file.GetAttribute("type") == "file")
            {
                listBox1.Items.Add(file.Style.ToString());
                file.Focus();
                file.InvokeMember("Click");
                SendKeys.Send(@"C:'Users'John'Desktop'test1'blue-book-motorcycle.jpg" + "{ENTER}");
            }
        }   

下面是另一个:

        mshtml.HTMLDocument doc = (mshtml.HTMLDocument)webBrowser1.Document.DomDocument;
        // ################################################################################
        //get the title textbox
        IHTMLElementCollection inputer = (IHTMLElementCollection)doc.getElementsByTagName(@"input");
        foreach (IHTMLElement element in inputer) 
        {
            listBox1.Items.Add(element.style.cssText + " ||| " + element.getAttribute("type").ToString() + "%%%" + element.className);
            //we also get other textboxes with similar class names that begin with 
            //gwt-TextBox so we test for it.
            if(element.style.cssText=="height: 0px; visibility: hidden; position: absolute;" && 
               element.getAttribute("type").ToString()=="file")
            {
                ++i;
                if(i==3)
                {
                    element.click();
                    SendKeys.Send(@"C:'Users'John'Desktop'test1'blue-book-motorcycle.jpg" + "{ENTER}");
                }
            }
            //webBrowser1.Update();
        }

它们都是失败的,因为即使出现了打开对话框,也没有在打开对话框文本框中输入任何键,它只是坐在那里什么也不做。

另外,如果我在opendialog中单击CANCEL按钮,我会得到以下错误:":'Users'john'Desktop'test1'blue-book-motorcycle.jpg文件名无效"。因此,opendialog文本框从我的键中剥离了"C"。有什么问题吗?我也以管理员的身份运行它。失败! !

WebBrowser OpenDialog自动化在.net中失败

你失败了,因为你正试图把文本从你的WebBrowser的窗体的线程模态对话框。你这样做是不会成功的。如果你想在对话框中填写文件名并按回车键,你需要创建另一个线程,然后发送你需要的键。

试试这样写:

    private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        var elementsx = webBrowser1.Document.GetElementsByTagName("input");
        foreach (HtmlElement file in elementsx)
        {
            if (file.GetAttribute("type") == "file")
            {
                listBox1.Items.Add(file.Style.ToString());
                file.Focus();
                file.InvokeMember("Click");
                Task.Delay(500).ContinueWith(t => SendFileName(@"C:'Users'John'Desktop'test1'blue-book-motorcycle.jpg"), TaskScheduler.FromCurrentSynchronizationContext());
            }
        }
    }
    private void SendFileName(string fileName)
    {
        SendKeys.Send(fileName + "{ENTER}");
    }