我在使用MSHTML COM组件从该网站抓取一些数据时遇到问题。我的WPF表单上有一个WebBrowser
控件。
我在WebBrowser LoadCompleted
事件中检索HMTL元素的代码。在将数据的值设置为HTMLInputElement
并在HTMLInputButtonElement
上调用click方法之后,它拒绝提交请求并显示下一页。
我分析了按钮上onclick属性的HTML,它实际上是在调用JavaScript函数并处理我的请求。这使我不确定调用JavaScript函数是否引起了问题?但是有趣的是,当我将代码从LoadCompleted
方法中取出并放在按钮单击事件中时,实际上将我带到下一页,因为LoadCompleted
方法没有执行。这样做会破坏尝试自动对页面进行屏幕抓屏的目的。
另一个想法是:当我在LoadCompleted
方法中包含代码时,我想HTMLInputButtonElement
不能完全呈现到页面上,这会导致点击事件无法触发,尽管我在其中查看对象时在运行时,实际上是在此处保存了提交按钮元素,并且状态说我完成了,这更加使我感到困惑。
这是我在LoadCompleted
方法和按钮上的click方法内使用的代码:
private void browser_LoadCompleted(object sender, NavigationEventArgs e)
{
HTMLDocument dom = (HTMLDocument)browser.Document;
IHTMLElementCollection elementCollection = dom.getElementsByName("PCL_NO_FROM.PARCEL_RANGE.XTRACKING.1-1-1.");
HTMLInputElement inputBox = null;
if (elementCollection.length > 0)
{
foreach (HTMLInputElement element in elementCollection)
{
if (element.name.Equals("PCL_NO_FROM.PARCEL_RANGE.XTRACKING.1-1-1."))
{
inputBox = element;
}
}
}
inputBox.value = "Test";
elementCollection = dom.getElementsByName("SUBMIT.DUM_CONTROLS.XTRACKING.1-1.");
HTMLInputButtonElement submitButton = null;
if (elementCollection.length > 0)
{
foreach (HTMLInputButtonElement element in elementCollection)
{
if (element.name.Equals("SUBMIT.DUM_CONTROLS.XTRACKING.1-1."))
{
submitButton = element;
}
}
}
submitButton.click();
}
仅供参考:这是我尝试使用MSHTML访问的网页的URL,
http://track.dhl.co.uk/tracking/wrd/run/wt_xtrack_pw.entrypoint。
最佳答案
有很多可能性:
您可以尝试将代码放在
其他事件,例如导航
已完成,或已下载完成。
您可能需要在click()函数之后显式评估OnClick事件。
使用MS WebBrowser控件是
比使用MSHTML COM更容易。
为了使生活更轻松,您可以只使用Web抓取库(例如IRobotSoft ActiveX控件)来自动化整个过程。