使用Windows.Forms.WebBrowser时访问文档元素

时间:2018-03-16 20:27:57

标签: winforms webbrowser-control

我是网页访问自动化的新手,所以原谅可能是一个补救问题。我在控制台应用程序中使用C#/ Windows.Forms。我需要以编程方式在网页上输入我无法修改且运行javascript的输入值。我已成功打开页面(触发WebBrowser.DocumentCompleted).我将浏览器仿真模式设置为IE11(在注册表中),因此脚本运行时没有错误。当DocumentCompleted()触发时,我无法在没有首先查看文档的情况下访问文档元素内容来自MessageBox.Show(),这对我的无人值守应用来说显然是不可接受的。

我需要做什么才能使我的文档元素在无人参与的会话中是可访问的(所以我可以从下面的代码中删除MessageBox.Show())?详情如下。谢谢。

输入HTML是:

<input class="input-class" on-keyup="handleKeyPress($key)" type="password">

我的DocumentCompleted事件处理程序是:

    private static void LoginPageCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        WebBrowser wb = ((WebBrowser)sender);

        var document = wb.Document;

    // I'm trying to eliminate these 3 lines
        var documentAsIHtmlDocument = (mshtml.IHTMLDocument)document.DomDocument;
        var content = documentAsIHtmlDocument.documentElement.innerHTML;
        MessageBox.Show(content);

        String classname = null;
        foreach (HtmlElement input in document.GetElementsByTagName("input"))
        {
            classname = input.GetAttribute("className");

            if (classname == "input-class")
            {
                input.SetAttribute("value", password);
                break;
            }
        }
   }

2 个答案:

答案 0 :(得分:1)

我的问题是我正在访问的页面是由javascript创建的。即使documentComplete事件被触发,页面仍未完全呈现。我已经成功处理了第一页,等待文档元素可用,如果不可用,在循环中执行Application.DoEvents();直到它们为止,所以我现在知道我在正确的轨道上。

这个SO问题帮助了我:c# WebBrowser- How can I wait for javascript to finish running that runs when the document has finished loading?

请注意,检查DocumentComplete并不能准确指示javascript生成的页面上文档元素的可用性。我需要继续检查元素并运行Application.DoEvents()直到它们可用(在javascript生成它们之后)。

答案 1 :(得分:0)

如果问题来自创建一个STAThread,这是实例化WebBrowser控件的底层Activex组件所必需的,这是 您链接的SO问题中显示的Hans Passant's code的修改版本。

在控制台项目中测试。

ListViewItem