我是一名业余爱好者,希望做到以下几点:
我在过去几个月里写过几个Web抓取器/解析器(全部用Java),但现在我在使用C#和.NET时遇到了一些困难。
我正在使用Visual Studio 2015 IDE,如果可能的话,我不想使用第三方工具/插件等(如果可能的话,请尽量不提供暗示HtmlAgilityPack,JSoup ..等价物或其他的答案)。 .NET的一切核心(或者通常只是C#)等都很好。
(1)和(2)已经可以使用,我可以登录提供用户名和密码,然后在图片上click()
,并使用相同的代码重定向到表单。
我现在有以下代码:( CAVE:这是一个WPF项目( NOT 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!
}
每次运行代码时,我都会执行以下操作:
启动应用程序 - > WebBrowser打开,将我引导至主页。
点击Button1(Browser_Login) - >自动填充用户名&&密码 - >点击提交(我现在登录)
单击Button2(Browser_ClickOnImageLinkToGetToForm) - > "点击()"在图像上,重定向到表单。
点击Button3(Browser_FillForm) - > RuntimeException的:
其他信息:' System .__ ComObject'不包含' textContent'的定义或定义'值'内容文字'的定义或定义' InnerHtml'等。
我尝试过很多不同的东西,似乎没有用。
我要填充的TextField具有以下属性:
<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对象和其他一些东西编写Wrapper。我不想写一个Wrapper强硬,也不想检查32- / 64-bit,我想在每个系统上运行它。
有人会为此提供一个简单的标准.Net / C#解决方案吗?请记住,我是一个业余爱好者,我不是一个专业的开发人员(也许如果不了解一些超级深入的例子(我绝对会学到它们很难))。
TL; DR:
如何使用.NET / C#填写使用WPF WebBrowser控件检查keyup上内容的表单!
答案 0 :(得分:4)
如果你像这样抓住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;
}
不确定为什么你在做什么不起作用,但我从一个有效的解决方案中复制了这段代码。如果您在主线程上,可以删除Dispatcher。
你得到的COM对象有很多方法,就像在JavaScript中一样。因此,要设置文本,您可以执行以下操作:
document.getElementById("bob").value = "fred";