Проблема с MSHTML COM нажатием кнопки отправки - PullRequest
2 голосов
/ 16 июля 2010

У меня возникла проблема с очисткой некоторых данных с этого веб-сайта с помощью компонента MSHTML COM. У меня есть WebBrowser элемент управления в моей форме WPF. Код, в котором я получаю элементы HMTL, находится в событиях WebBrowser LoadCompleted. После того, как я установил значения данных на HTMLInputElement и вызвал метод щелчка на HTMLInputButtonElement, он отказывается отправить запрос и отобразить следующую страницу.

Я анализирую HTML-код для атрибута onclick на кнопке, он фактически вызывает функцию JavaScript и обрабатывает мой запрос. Что заставляет меня не быть уверенным, что вызов функции JavaScript вызывает проблему? Но как ни странно, когда я извлекаю свой код из метода LoadCompleted и помещаю его в событие нажатия кнопки, он фактически выводит меня на следующую страницу, где метод LoadCompleted не сработал. Подобные действия лишают смысла попытки автоматически скрашивать страницу.

Еще одна мысль: когда у меня был код внутри метода LoadCompleted, я думаю, что HTMLInputButtonElement не полностью отображается на странице, что приводит к тому, что событие click не срабатывает, несмотря на тот факт, что при просмотре объект во время выполнения фактически удерживает там элемент кнопки отправки, и состояние говорит, что я завершил, что еще больше сбивает меня с толку.

Вот код, который я использовал внутри метода 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();
}

К вашему сведению: это URL-адрес веб-страницы, к которой я пытаюсь получить доступ, используя MSHTML, http://track.dhl.co.uk/tracking/wrd/run/wt_xtrack_pw.entrypoint.

Ответы [ 2 ]

0 голосов
/ 22 марта 2011

Задержка в OnBeforeNavigate может привести к сбою действий щелчка.

Мы заметили, что при некоторых действиях отправки OnBeforeNavigate вызывается дважды, особенно там, где используется onClick. Первый вызов выполняется до того, как будет выполнено действие onClick, второй - после его завершения.

Выключите BHO, установите точку останова на onClick, перешагните через действие отправки return jsSubmit(), затем немного подождите, и вы сможете вызвать такую ​​же проблему без вашей автоматизации.

Любая задержка> 150 мс при втором вызове OnBeforeNavigate приводит к некоторой ошибке при загрузке страницы / переходе к результату.

Edit:
Попробовав собственную автоматизацию этой страницы DHL, у нас в настоящее время нет проблем с указанным выше временем.

0 голосов
/ 23 июля 2010

Существует множество возможностей:

  • Вы можете попытаться разместить свой код на других мероприятиях, например, при завершении навигации или при завершении загрузки.

  • Возможно, вам потребуется явно оценить событие OnClick после функции click ().

  • Использовать элемент управления MS WebBrowser проще, чем использовать MSHTML COM.

  • Чтобы упростить жизнь, вы можете просто использовать библиотеку для создания веб-страниц, такую ​​как IRobotSoftЭлемент управления ActiveX для автоматизации всего процесса.
...