我在使用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控件)来自动化整个过程。

10-07 19:34
查看更多