如何使用 C# / IHTMLDocument2 设置文本字段的值
本文关键字:置文本 字段 IHTMLDocument2 何使用 | 更新日期: 2023-09-27 18:32:53
我是一个业余程序员,想做以下事情:
- 通过用户名登录网站 -/密码
- 单击将我定向到某个(子(网站的图片
- 填写表格 在提交表单之前,
- 我想加载整个页面,并在提交之前查看我的应用程序提供的输入内容。
在过去的几个月里,我写了几个Web爬虫/解析器(全部用Java(,但现在我在C#和.NET方面遇到了很多困难。
我正在使用Visual Studio 2015 IDE,如果可能的话,我不希望使用第三方工具/插件等(如果可能,请尽量不要提供暗示HtmlAgilityPack,JSoup等效物或其他的答案(。不过,.NET(或一般的C#(等所有核心都很好。
(1(和(2(已经工作了,我可以登录提供用户名和密码,然后在图片上click()
并使用如下所示的相同代码重定向到表单。
我目前有以下代码:(CAVE:这是一个WPF项目(不是WINFORMS(,使用IHTMLDocument
(2(
目前我的代码如下所示:
using System;
using System.Windows;
using System.Windows.Input;
using System.Windows.Navigation;
using mshtml;
using System.Diagnostics;
public partial class MainWindow : Window
{
private CustomObject testObject;
public IHTMLDocument2 doc2;
public MainWindow()
{
InitializeComponent();
Browser.Navigate("https://www.xXx.xXx/"); //The Browser is the standard WPF WebBrowser
// Several other functions like LoadComplete etc. here
}
// Function for login
private void Browser_Login(object sender, RoutedEventArgs e)
{
doc2.all.item("ID_OF_USERNAME_TEXTFIELD").value = "MyUsername";
doc2.all.item("ID_OF_PASSWORD_TEXTFIELD").value = "MyPassWord";
doc2.all.item("NAME_OF_SUBMIT_BUTTON").click();
}
private void Browser_ClickOnImageLinkToGetToForm(object sender, RoutedEventArgs e)
{
// Logic to get to the Form, everything works as expected
}
private void Browser_FillForm(object sender, RoutedEventArgs e)
{
doc2.all.item("NAME_OF_THE_TEXTFIELD_TO_FILL").value = "Text if want to put into the field";
// /repeat for all other TextFields and a couple of other input elements.
--> Exception!
}
每次运行代码时,我都会执行以下操作:
启动应用程序 --> Web浏览器打开,将我定向到主页。
单击按钮1(Browser_Login(-->自动填充用户名和密码-->单击提交(我现在已登录(
单击Button2(Browser_ClickOnImageLinkToGetToForm(-->图像上的"Click((",重定向到表单。
单击 Button3 (Browser_FillForm( --> 运行时异常:
附加信息:"System.__ComObject"不包含"textContent"的定义或"值"的定义或"InnerText"的定义或"InnerHtml"的定义等。
我尝试了很多不同的东西,似乎没有一种有效。
我要填充的文本字段具有以下属性:
<input class="TxtField1" maxlength="800" type="text" id="Title" name="Title" value="" onkeyup="checkField(this.name);" onblur="checkField(this.name);" style="width: 550px; cursor: help; background-color: rgb(228, 234, 224);" title="Some Title">
我从来没有遇到过用 Java 编码的此类问题,也有人提到我应该检查 32/64 位系统,有些人建议为the_COM对象和其他一些东西编写一个包装器。我不想写一个艰难的包装器,也不想检查 32 -/64 位,我想在每个系统上运行它。
有人会为此提供一个简单的标准 .Net/C# 解决方案吗?请记住,我是一个业余爱好者,我不是专业的开发人员(也许如果不会理解一些超级深入的例子(我肯定会很难学习它们((。
博士:
如何填写一个表单,该表单使用.NET/C#使用WPF WebBrowser控件检查键控内容!
如果你像这样掌握 DOM,你可以做很多事情:
private dynamic GetDOM(WebBrowser wb)
{
dynamic document = null;
System.Threading.Thread.Sleep(500);
while (document == null)
{
Dispatcher.Invoke(() => document = wb.Document);
System.Threading.Thread.Sleep(100);
}
return document;
}
不知道为什么你正在做的事情不起作用,但我从一个有效的解决方案中复制了这段代码。 如果你在主线程上,你可以剪掉调度程序的东西。
你会得到一个COM对象,它有很多方法,就像在JavaScript中一样。 因此,要设置文本,您可以执行以下操作:
document.getElementById("bob").value = "fred";