2010-07-15 170 views
2

我在使用MSHTML COM組件屏蔽本網站的一些數據時出現問題。我的WPF表單上有一個WebBrowser控件。 我檢索HMTL元素的代碼位於WebBrowser LoadCompleted事件中。將數據的值設置爲HTMLInputElement並調用HTMLInputButtonElement上的點擊方法後,它拒絕提交請求並顯示下一頁。MSHTML COM問題點擊提交按鈕

我分析上的按鈕,它實際上是調用JavaScript函數onclick屬性的HTML和它處理了我的請求。這讓我不確定是否調用JavaScript函數導致問題?但有趣的是,當我將代碼從LoadCompleted方法中提取出來並將其放入按鈕單擊事件中時,它實際上將我帶到下一頁,因爲LoadCompleted方法沒有做到這一點。做這種事情會挫敗嘗試自動屏幕頁面的重要性。

關於另一個想法:當我有LoadCompleted方法中的代碼時,我認爲HTMLInputButtonElement沒有完全渲染到導致點擊事件沒有觸發的頁面,儘管事實上當我看着對象運行時間它實際上是在那裏提交按鈕元素,並且狀態是說我完成了,這讓我更加困惑。

這裏是我的LoadCompleted方法中使用的代碼和按鈕的點擊方法:

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(); 
} 

FYI:這是網頁,我嘗試使用MSHTML訪問的URL, http://track.dhl.co.uk/tracking/wrd/run/wt_xtrack_pw.entrypoint

+0

嗨,我面臨同樣的問題。你能找到解決方案嗎? – 2011-05-27 23:03:52

+0

我解決了這個問題,不使用表單按鈕,而是獲取表單元素本身並在其上調用'submit()'。 – ViliX64 2017-09-10 10:08:41

回答

0

有很多可能性:

  • 您可以嘗試把你的代碼在其他 活動,如導航 完成,或下載完成。

  • 您可能需要在click()函數之後顯式評估OnClick事件。

  • 使用MS web瀏覽器控件比使用MSHTML COM容易 。

  • 爲了使生活更輕鬆,你可以只使用一個webscraping庫如IRobotSoft ActiveX控件自動整個過程。
0

延遲OnBeforeNavigate可引起點擊操作失敗。

我們注意到,一些提交行動OnBeforeNavigate被調用了兩次,尤其是在的onClick使用。第一次調用是在onClick動作執行之前,第二次是在完成之後。

關閉您的BHO,在onClick上放置一個斷點,逐步完成提交動作return jsSubmit(),然後稍等一下,您應該能夠在沒有自動化的情況下導致相同的問題。

任何延遲在所述第二呼叫,以OnBeforeNavigate> 150毫秒導致頁面加載/導航,結果一些故障。

編輯:
嘗試過我們自己的,我們沒有這個DHL頁面的自動化目前有與上述時間的問題。