Webbrowser 控件 select 单选按钮并单击提交

Webbrowser control select radio button and click submit

我正在尝试让我的 WebBrowser 控制 select 一个单选按钮,同时单击一个没有任何 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");

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

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

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

你缺少 + 那里。

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

但假设您想根据其他一些条件查找元素,例如根据 valuetype 属性,在您通过 Document.GetElementByTagName 或通过获取 Document.All 事件,要应用更多过滤器,您可以使用 Cast<HtmlElement> 将集合转换为 IEnumerable<HtmlElement>,然后使用 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");
};

很简单,您就快到了,您可以将此代码段放入 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");

I'm trying to get my webbrowser1 to click/select a radio button and as well click a submit button without any id or name.

但是你的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;


}