CppWebBrowser網頁重整並未更新 |
答題得分者是:TWY
|
GGL
資深會員 發表:104 回覆:600 積分:335 註冊:2006-11-05 發送簡訊給我 |
我寫了一個自動登入網頁的程式,CppWebBrowser DocumentComplete事件內容如下
當我連到第一個登入頁面的時候,會自動登入,並將iURLPos 設為 1 (這邊是成功的) 之後判斷如果網頁包含"登出",表示登入成功。接著開啟第二個網頁URL2 URL2是個預約系統,每天晚上的12點會開啟,如果還沒12點,網頁原始碼不會有日期(2010/5)這個字串 因此我是透過一直重整,直到出現"2010/5"這個字串為止,表示可以開始預約 但是現在有個問題,如果我是系統開放(12點後)開啟程式,可以自動預約成功 但是如果我11點多開始重整,日期欄位是空白的...到了12點之後,日期欄位還是空白 似乎沒有真的重新開啟頁面,只是在一開始的頁面刷新,請問該怎麼改寫才能真的重整? 謝謝 [code cpp] void __fastcall TForm1::CppWebBrowser_MainDocumentComplete(TObject *Sender, LPDISPATCH pDisp, Variant *URL) { if(iURLPos == 1) { Variant doc = CppWebBrowser_Main->ControlInterface->Document; if (((IDispatch *)doc) != NULL) { Variant body = doc.OlePropertyGet("Body"); Variant html = body.OlePropertyGet("InnerHTML"); AnsiString tmp_body = html; if(tmp_body.Pos("登出")>0) { iURLPos = 2; CppWebBrowser_Main->Navigate(Variant(URL2)); //若一開始的網頁原始碼包含登出(表示登入成功),則開啟開啟另一個URL } } } else if(iURLPos == 2) { Timer_Refresh->Enabled = false; Variant doc = CppWebBrowser_Main->ControlInterface->Document; if (((IDispatch *)doc) != NULL) { Variant body = doc.OlePropertyGet("Body"); Variant html = body.OlePropertyGet("InnerHTML"); AnsiString tmp_body = html; if(tmp_body.Pos("2010/5")>0) { Timer_Refresh->Enabled = false; Variant disp,alllinks,eachlink; int linkcount; disp = CppWebBrowser_Main->Document; alllinks = disp.OlePropertyGet("links"); linkcount = alllinks.OlePropertyGet("length"); for (int i=0;i <linkcount;i )<br /> { eachlink = alllinks.OleFunction("item",i); if( i == 0) { eachlink.OleFunction("click"); //僅點選網頁第一個按鈕 iURLPos = 3; break; } } } else { Sleep(1000); //每1秒重整一次 CppWebBrowser_Main->Navigate(Variant(URL2)); //試過用Refresh()仍然無效 } } } } [/code] |
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
這個我試過
不論IE的CHACH有沒有清,這元件的REFRESH就是給我假動作 所以算是無解了。 ===================引 用 GGL 文 章=================== 我寫了一個自動登入網頁的程式,CppWebBrowser DocumentComplete事件內容如下 當我連到第一個登入頁面的時候,會自動登入,並將iURLPos 設為 1 (這邊是成功的) 之後判斷如果網頁包含"登出",表示登入成功。接著開啟第二個網頁URL2 URL2是個預約系統,每天晚上的12點會開啟,如果還沒12點,網頁原始碼不會有日期(2010/5)這個字串 因此我是透過一直重整,直到出現"2010/5"這個字串為止,表示可以開始預約 但是現在有個問題,如果我是系統開放(12點後)開啟程式,可以自動預約成功 但是如果我11點多開始重整,日期欄位是空白的...到了12點之後,日期欄位還是空白 似乎沒有真的重新開啟頁面,只是在一開始的頁面刷新,請問該怎麼改寫才能真的重整? 謝謝 [code cpp] void __fastcall TForm1::CppWebBrowser_MainDocumentComplete(TObject *Sender, LPDISPATCH pDisp, Variant *URL) { if(iURLPos == 1) { Variant doc = CppWebBrowser_Main->ControlInterface->Document; if (((IDispatch *)doc) != NULL) { Variant body = doc.OlePropertyGet("Body"); Variant html = body.OlePropertyGet("InnerHTML"); AnsiString tmp_body = html; if(tmp_body.Pos("登出")>0) { iURLPos = 2; CppWebBrowser_Main->Navigate(Variant(URL2)); //若一開始的網頁原始碼包含登出(表示登入成功),則開啟開啟另一個URL } } } else if(iURLPos == 2) { Timer_Refresh->Enabled = false; Variant doc = CppWebBrowser_Main->ControlInterface->Document; if (((IDispatch *)doc) != NULL) { Variant body = doc.OlePropertyGet("Body"); Variant html = body.OlePropertyGet("InnerHTML"); AnsiString tmp_body = html; if(tmp_body.Pos("2010/5")>0) { Timer_Refresh->Enabled = false; Variant disp,alllinks,eachlink; int linkcount; disp = CppWebBrowser_Main->Document; alllinks = disp.OlePropertyGet("links"); linkcount = alllinks.OlePropertyGet("length"); for (int i=0;i } } } [/code] |
GGL
資深會員 發表:104 回覆:600 積分:335 註冊:2006-11-05 發送簡訊給我 |
|
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
Indy也可以做這個工作
但Indy8也一樣會有假動作的問題 Indy9和10沒試過,哈! ===================引 用 GGL 文 章=================== 感謝您的回覆.... 但是即使不用refresh...CppWebBrowser->Navigate();也沒辦法真的重整 我也試過用個timer去跑,仍然不行 昨天臨時的作法是,另外寫一個程式,負責跑timer,每一秒就執行一次原本這隻程式 但是今天發現沒執行,才發現我啟動程式的系統排程時間設錯 但這畢竟不是個好辦法 難道CppWebBrowser偵測到開啟過的網頁都只是假的重整嗎? |
GGL
資深會員 發表:104 回覆:600 積分:335 註冊:2006-11-05 發送簡訊給我 |
|
TWY
高階會員 發表:2 回覆:133 積分:152 註冊:2009-09-02 發送簡訊給我 |
提供一個重要觀念與小技巧參考。
IE 為了提昇效能,若收到 GET method 且 request url 與先前存在 IE Cache 一樣的話,就不會把 request 送到後端 server,而直接把 local Cache response 結果直接再回覆、呈現給客戶端。但 POST method 則每次都一定會送到後端 (web) server。 這個現象不能說是 Bug,而是 IE 為效能的一種機制,但往往與使用者預期的結果不同。 解決方法,1. 可以關閉 IE Cache。 2. 在 GET URL 加上一個 dummy 參數,例如 http://mysite/GetName.asp?ID=123&dummy=Now() dummy=Now() 會使得每次提出的 URL 皆不同,IE 看到不同的 URL 就一定會將request 送到後端。 希望能有所幫助~ ps: dummy=Now() 我提供的只是一個作法,語法正確性請自行修正喔 |
GGL
資深會員 發表:104 回覆:600 積分:335 註冊:2006-11-05 發送簡訊給我 |
原來如此,難怪我今天用vs.net c#重寫仍然有問題
等等來試試看 ===================引 用 TWY 文 章=================== 提供一個重要觀念與小技巧參考。 IE 為了提昇效能,若收到 GET method 且 request url 與先前存在 IE Cache 一樣的話,就不會把 request 送到後端 server,而直接把 local Cache response 結果直接再回覆、呈現給客戶端。但 POST method 則每次都一定會送到後端 (web) server。 這個現象不能說是 Bug,而是 IE 為效能的一種機制,但往往與使用者預期的結果不同。 解決方法,1. 可以關閉 IE Cache。 2. 在 GET URL 加上一個 dummy 參數,例如 http://mysite/GetName.asp?ID=123&dummy=Now() dummy=Now() 會使得每次提出的 URL 皆不同,IE 看到不同的 URL 就一定會將request 送到後端。 希望能有所幫助~ ps: dummy=Now() 我提供的只是一個作法,語法正確性請自行修正喔 |
GGL
資深會員 發表:104 回覆:600 積分:335 註冊:2006-11-05 發送簡訊給我 |
關掉IE Cache是否在:瀏覽歷程紀錄裡的設定 - 檢查頁面是否有較新的版本:勾選無
關了一後還是無效 使用dummy=Now()也無效,這需要server端的支援嗎?還是我自己加這樣就有作用 我試過在兩個網址來回重整,結果仍然一樣...失敗 請問是我ie設錯,還是dummy這東西我誤解有問題?謝謝 ===================引 用 TWY 文 章=================== 提供一個重要觀念與小技巧參考。 IE 為了提昇效能,若收到 GET method 且 request url 與先前存在 IE Cache 一樣的話,就不會把 request 送到後端 server,而直接把 local Cache response 結果直接再回覆、呈現給客戶端。但 POST method 則每次都一定會送到後端 (web) server。 這個現象不能說是 Bug,而是 IE 為效能的一種機制,但往往與使用者預期的結果不同。 解決方法,1. 可以關閉 IE Cache。 2. 在 GET URL 加上一個 dummy 參數,例如 http://mysite/GetName.asp?ID=123&dummy=Now() dummy=Now() 會使得每次提出的 URL 皆不同,IE 看到不同的 URL 就一定會將request 送到後端。 希望能有所幫助~ ps: dummy=Now() 我提供的只是一個作法,語法正確性請自行修正喔 |
TWY
高階會員 發表:2 回覆:133 積分:152 註冊:2009-09-02 發送簡訊給我 |
抱歉沒講很清楚。IE 的部分應該是勾選 "每次都檢查最新版本" 那個選項 (我IE目前損毀開不起來 無法查證字眼,不過就是那個沒錯)
至於 dummy=Now() 你不可以照打喔,Now() 是取出當下日期時間的意思,用意在於每次都提出完全不同的 URL 的意思。(只要參數不同,Browser 就會視為全新的 Request 而不從 Cache 取舊畫面) 舉例若你是用 Delphi 動態組合 URL,寫法可能是 sURL := 'http://MySite/GetName?ID=123&dummy=' FormatDateTime('YYYYMMDDHHNNSS',Now); 所以那個 Now() 只是一個意思,看你用何種語言,變換一下組出完全新的 URL 參數。 這個我以前有 try 過證實過的,所以這個論點應該無誤 (當初從 Head Rush Ajax 書上看到的),你再試看看吧~ ===================引 用 GGL 文 章=================== 關掉IE Cache是否在:瀏覽歷程紀錄裡的設定 - 檢查頁面是否有較新的版本:勾選無 關了一後還是無效 使用dummy=Now()也無效,這需要server端的支援嗎?還是我自己加這樣就有作用 我試過在兩個網址來回重整,結果仍然一樣...失敗 請問是我ie設錯,還是dummy這東西我誤解有問題?謝謝 |
GGL
資深會員 發表:104 回覆:600 積分:335 註冊:2006-11-05 發送簡訊給我 |
謝謝TWY的回覆
原來那個NOW是要寫在程式裡面,我還以為送出那樣,會自動取得SERVER的時間 因為從沒設定過IE的cache,所以設定錯誤,謝謝了 雖然還沒到測試時間,但是我想...應該會成功,就先給分了 又讓我學到了東西,差點誤會BCB了 謝謝 ===================引 用 TWY 文 章=================== 抱歉沒講很清楚。IE 的部分應該是勾選 "每次都檢查最新版本" 那個選項 (我IE目前損毀開不起來 無法查證字眼,不過就是那個沒錯) 至於 dummy=Now() 你不可以照打喔,Now() 是取出當下日期時間的意思,用意在於每次都提出完全不同的 URL 的意思。(只要參數不同,Browser 就會視為全新的 Request 而不從 Cache 取舊畫面) 舉例若你是用 Delphi 動態組合 URL,寫法可能是 sURL := 'http://MySite/GetName?ID=123&dummy=' FormatDateTime('YYYYMMDDHHNNSS',Now); 所以那個 Now() 只是一個意思,看你用何種語言,變換一下組出完全新的 URL 參數。 這個我以前有 try 過證實過的,所以這個論點應該無誤 (當初從 Head Rush Ajax 書上看到的),你再試看看吧~ ===================引 用 GGL 文 章=================== 關掉IE Cache是否在:瀏覽歷程紀錄裡的設定 - 檢查頁面是否有較新的版本:勾選無 關了一後還是無效 使用dummy=Now()也無效,這需要server端的支援嗎?還是我自己加這樣就有作用 我試過在兩個網址來回重整,結果仍然一樣...失敗 請問是我ie設錯,還是dummy這東西我誤解有問題?謝謝 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |