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
.
但假设您想根据其他一些条件查找元素,例如根据 value
或 type
属性,在您通过 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;
}
我正在尝试让我的 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
.
但假设您想根据其他一些条件查找元素,例如根据 value
或 type
属性,在您通过 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;
}