我正在一个简单的应用程序上工作,该应用程序会自动在包含两个下拉菜单和一个按钮的页面中浏览。该页面如下所示:



现在的问题是,通过选择DropDown2可动态生成Dropdown1的内容。

我在C#中编写了这样的代码:

private void webBrowser1_DocumentCompleted(object sender,
        WebBrowserDocumentCompletedEventArgs e)
{
    HtmlElement elem = webBrowser1.Document.GetElementById("DropDown1");
    elem.SetAttribute("selectedIndex", "1");
    elem.RaiseEvent("onChange");
    HtmlElement elem = webBrowser1.Document.GetElementById("DropDown2");
    elem.SetAttribute("selectedIndex", "5");
    elem.RaiseEvent("onChange");
}

引发onChange事件后,浏览器将加载新值,但由于文档仍然认为DropDown2的值为空,因此我无法获取并设置DropDown2值。

如何获取和设置DropDown2中生成的新值?

最佳答案

我通过引发onChange事件后调用“__doPostBack”脚本找到了解决方案。当我调用doPostBack时,文档将重新加载,因此我可以检索新值。这是代码:

    private void BeginOperation()
    {
        webBrowser1.Navigate("somewebpage", false);
        Task = 0;
    }
    private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        HtmlElement elem;

        switch (Task)
        {
            case 0:
                //HtmlDocument mydoc = webBrowser1.Document;
                 elem = webBrowser1.Document.GetElementById("ddlCity");
                MessageBox.Show(elem.All.Count.ToString());
                elem.SetAttribute("selectedIndex", "1");
                //elem.RaiseEvent("onChange");
                object[] args = {"someparameters"};
                webBrowser1.Document.InvokeScript("__doPostBack",args);
                Task++;
            break;
            case 1:
                elem = webBrowser1.Document.GetElementById("ddlDistrict");
                elem.SetAttribute("selectedIndex", "2");
                elem.RaiseEvent("onChange");
                object[] args2 = {"someparameters"};
                webBrowser1.Document.InvokeScript("__doPostBack",args2);
                Task++;
            break;
        }
     }

关于标签C#webBrowser.Document : reloading page after postback,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5168278/

10-11 05:12