c# - c#在Web浏览器中调用click后获取新页面的URL
问题描述
我必须使用 C# 中的应用程序控制台浏览某些页面,我有一个已知的 URL 作为起始页面,但其他 URL 未知,我通过单击起始页面中的按钮来访问它们。
这是我需要在页面上单击的按钮的代码:
<input name="ctl00$ContentPlaceHolder1$btn_invia" type="button" id="myId" onclick="ReDirect();" class="myClass" value="BUTTON TEXT" />
我尝试使用此代码导航到起始页,它可以工作:
class Program
{
private static WebBrowser wb1 = new WebBrowser();
[STAThread]
static void Main(string[] args)
{
runBrowserThread(new Uri("http://www.myUrl.com"));
}
private static void runBrowserThread(Uri url)
{
var th = new Thread(() => {
var br = new WebBrowser();
br.DocumentCompleted += Br_DocumentCompleted; ;
br.Navigate(url);
Application.Run();
});
th.SetApartmentState(ApartmentState.STA);
th.Start();
}
private static void Br_DocumentCompleted(object sender,
WebBrowserDocumentCompletedEventArgs e)
{
//Retrieve string content of document
var document = ((WebBrowser)sender).Document;
var documentAsIHtmlDocument3 =
(mshtml.IHTMLDocument3)document.DomDocument;
var content = documentAsIHtmlDocument3.documentElement.innerHTML;
//Parse content with html agility pack or whatever
//Click on button
wb1.Document.GetElementById("myId").InvokeMember("click");
Application.ExitThread();
}
}
当我单击按钮时,它会加载一个新页面。但是当我称之为.InvokeMember("click");
冻结时,我怎样才能让 WebBrowser wb1 转到新页面?
解决方案
我发现我错了,我打电话wb1.Document.GetElementById("myId").InvokeMember("click");
但 wb1 没有初始化,所以我没有调用.InvokeMember("click")
现有元素。我是这样修改的:
((WebBrowser)sender).Document.GetElementById("myId").InvokeMember("Click");
在Br_DocumentCompleted
方法中,现在它可以工作了。但是现在我又遇到了一个问题:我是Br_DocumentCompleted
这样修改方法的,因为我要在新页面中点击一个按钮,才能打开第三个页面:
private static void Br_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
//Retrieve string content of document
var document = ((WebBrowser)sender).Document;
var documentAsIHtmlDocument3 = (mshtml.IHTMLDocument3)document.DomDocument;
var content = documentAsIHtmlDocument3.documentElement.innerHTML;
if (((WebBrowser)sender).Url.AbsoluteUri.Contains("startpage.aspx"))
{
//Click on button
((WebBrowser)sender).ScriptErrorsSuppressed = true;
((WebBrowser)sender).Document.GetElementById("myId").InvokeMember("Click");
}
else if (((WebBrowser)sender).Url.AbsoluteUri.Contains("page1.aspx"))
{
((WebBrowser)sender).Document.GetElementById("btn_send").InvokeMember("Click");
}
else if (((WebBrowser)sender).Url.AbsoluteUri.Contains("page2.aspx"))
{
//Some code
Application.ExitThread();
}
}
page1 上的“btn_send”有以下代码:
<input onclick="openEVERFANCY('#CChildren','N'); return false;" id=btn_send class=buttonVerifyDisp type=button value=GO>
当我调用((WebBrowser)sender).Document.GetElementById("btn_send").InvokeMember("Click");
这个按钮时,它不会转到第三页,即使我有 DocumentCompleted 事件处理程序
推荐阅读
- python - 检查输入是否为数字
- r - 如何从R中的多个文档中提取多个引号?
- scilab - 如果我通过函数的回调尝试它,则无法在 scilab 中打印图形,因为 syslin 不认为两个参数相等
- vtiger - 卸载自定义模块生成器扩展是否会影响自定义创建的模块
- blogger - 如何设置 Blogger 布局部分的样式?
- java - 实现我自己的堆栈时测试用例不起作用
- android - 为什么无法使用从 firebase 实时数据库中获取的两个位置来获取距离
- spring-boot - 使用 RabbitMQ 作为绑定器的 Spring 云流的 Spring Security
- python - 尝试将小型应用程序部署到 Heroku 时出现应用程序崩溃错误
- javascript - 使用bootstrap vue分页如何为每个页面进行axios调用?