【问题标题】:Webbrowser control select radio button and click submitWebbrowser 控件选择单选按钮并单击提交
【发布时间】:2020-03-05 03:37:08
【问题描述】:

我正在尝试让我的WebBrowser 控件选择一个单选按钮并单击一个没有任何 ID 或名称的提交按钮。

这是来自网页的 html 代码:

<form method="post">
   <input type="radio" name="chosen" value="3" id="a3">
   <input type="radio" name="chosen" value="2" id="a2">
   <input type="radio" name="chosen" value="1" id="a1">
   <input value="Next" type="submit">
</form>

这是我尝试过的 C# 代码:

wbv(3); //This part just check every 3 seconds to see if the page the page has loaded before continuing with the code
webBrowser1.Document.GetElementsByTagName("input").GetElementsByName("chosen")[2].InvokeMember("click");
webBrowser1.Document.GetElementsByTagName("input").GetElementsByValue("Next")[0].InvokeMember("click");

我需要帮助来弄清楚如何让我的代码选择值为 3 的 radio 按钮,然后单击 submit 按钮。

【问题讨论】:

  • 那些错误是......?
  • 您在屏幕截图中分享的错误是编译时错误,我们看不到有此类错误的代码。无论如何,例如,我已经分享了一个答案,向您展示了如何单击单选按钮并以编程方式提交。

标签: c# html .net winforms webbrowser-control


【解决方案1】:

也许如果你真的费心阅读这些错误:

[..snip..] + version"&key="+ key. [..snip..]
                    ^---huh?

你在那里缺少+

【讨论】:

  • 最后还有一个,&key="+ key.Text"",无论如何都可以去掉最后的引号。
【解决方案2】:

很简单,你就快到了,你可以把这个 sn-p 放到 DocumentCompleted 处理程序中

注意:您不能使用 GetElementsByName 来触发您的提交按钮,因为它没有 name 属性或 Id 属性

var radioClick = webBrowser1.Document.GetElementsByTagName("input").GetElementsByName("chosen").OfType<HtmlElement>()
            .Where(x => x.Id == "a2").FirstOrDefault()
            .InvokeMember("Click");

var buttonClick = webBrowser1.Document.GetElementsByTagName("input").OfType<HtmlElement>()
            .Where(html => html.GetAttribute("type").Equals("submit") && html.GetAttribute("value").Equals("Next")).FirstOrDefault()
            .InvokeMember("Click");

我正在尝试让我的 webbrowser1 单击/选择一个单选按钮并作为 以及单击没有任何 id 或名称的提交按钮。

但是你的 HTML 似乎有一个 Id 和 Name,除了 Button,不过我们可以使用元素的 GetAttribute("value")

var radioBoxValue = "1";
var submitButtonValue = "Next";

//Click Radio Box
var findRadioBox = webBrowser1.Document.GetElementsByTagName("input").OfType<HtmlElement>()
                .Where(html => html.GetAttribute("type").Equals("radio") && html.GetAttribute("value").Equals(radioBoxValue)).FirstOrDefault();
findRadioBox.InvokeMember("Click");

//Click Button
var findsubmitButton = webBrowser1.Document.GetElementsByTagName("input").OfType<HtmlElement>()
                .Where(html => html.GetAttribute("type").Equals("submit") && html.GetAttribute("value").Equals(submitButtonValue)).FirstOrDefault();
 findsubmitButton.InvokeMember("Click");

 //Unsubscribing from the document completed event, there are times when you will run into situations where documentcompelted will fire multiple times
 webBrowser1.DocumentCompleted -= webBrowser1_DocumentCompleted;

完整片段

private async void button1_Click(object sender, EventArgs e)
{

    string url = @"https://localhost:5001/Home/Index";
    webBrowser1.AllowNavigation = true;
    webBrowser1.Navigate(url);
    this.webBrowser1.DocumentCompleted +=  webBrowser1_DocumentCompleted;

}

private async void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{

    var radioBoxValue = "1";
    var submitButtonValue = "Next";

    //Click Radio Box
    var findRadioBox = webBrowser1.Document.GetElementsByTagName("input").OfType<HtmlElement>()
                .Where(html => html.GetAttribute("type").Equals("radio") && html.GetAttribute("value").Equals(radioBoxValue)).FirstOrDefault();
    findRadioBox.InvokeMember("Click");

    //Click Button
     var findsubmitButton = webBrowser1.Document.GetElementsByTagName("input").OfType<HtmlElement>()
                .Where(html => html.GetAttribute("type").Equals("submit") && html.GetAttribute("value").Equals(submitButtonValue)).FirstOrDefault();
    findsubmitButton.InvokeMember("Click");

    //Unsubscribing from the document completed event, there are times when you will run into situations where documentcompelted will fire multiple times
    webBrowser1.DocumentCompleted -= webBrowser1_DocumentCompleted;


}

【讨论】:

  • 您介意解释一下它与other answer 有何不同吗?
【解决方案3】:

您的单选按钮具有id 属性,您可以选择使用GetElementById 查找它们。另外,要按名称获取元素,您可以使用GetElementByName

但是假设你想根据一些其他条件来查找元素,例如基于valuetype属性,在你通过Document.GetElementByTagName获取元素集合或通过获取Document.All获取事件之后,应用更多过滤器,您可以使用Cast&lt;HtmlElement&gt; 将集合转换为IEnumerable&lt;HtmlElement&gt;,然后使用linq 过滤结果。

您应该在文档完成后尝试查找元素,您通常应该将代码放在DocumentCompletet 事件处理程序中吗。在某些情况下,例如当使用 ajax 请求加载页面时,您需要稍等片刻,让页面加载。

示例 - 单击单选按钮并提交

webBrowser1.Navigate("the url or your page");
webBrowser1.DocumentCompleted += (obj, args) =>
{
    var element = webBrowser1.Document.GetElementsByTagName("input")
        .Cast<HtmlElement>()
        .Where(x => x.GetAttribute("value") == "2" &&
                    x.GetAttribute("name") == "chosen")
        .FirstOrDefault();
    element.InvokeMember("click");

    var submit = webBrowser1.Document.GetElementsByTagName("input")
        .Cast<HtmlElement>()
        .Where(x => x.GetAttribute("type") == "submit" &&
                    x.GetAttribute("value")=="Next")
        .FirstOrDefault();
        submit.InvokeMember("click");
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-31
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    • 2017-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多