MSHTML COM点击提交按钮时出现问题

时间:2010-07-15 21:23:47

标签: c# .net wpf screen-scraping webbrowser-control

我遇到问题,使用MSHTML COM组件从这个网站中截取一些数据。我的WPF表单上有WebBrowser控件。 我检索HMTL元素的代码位于WebBrowser LoadCompleted事件中。在我将数据值设置为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访问的网页的网址, http://track.dhl.co.uk/tracking/wrd/run/wt_xtrack_pw.entrypoint

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

OnBeforeNavigate延迟可能导致点击操作失败。

我们注意到,对于一些提交操作,OnBeforeNavigate被调用两次,特别是在使用onClick时。第一个调用是在执行onClick操作之前,第二个调用是在完成之后。

关闭你的BHO,在onClick上设置一个断点,跳过提交动作return jsSubmit(),然后稍等一下,你应该能够在没有自动化的情况下引发同样的问题。

第二次调用OnBeforeNavigate时,任何延迟> 150ms都会导致页面加载/导航到结果失败。

修改
在尝试了我们自己的DHL页面自动化之后,我们目前没有上述时序的问题。