全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2564
推到 Plurk!
推到 Facebook!

CppWebBrowser網頁重整並未更新

答題得分者是:TWY
GGL
資深會員


發表:104
回覆:600
積分:335
註冊:2006-11-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-05-07 22:57:45 IP:122.116.xxx.xxx 訂閱
我寫了一個自動登入網頁的程式,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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-05-11 13:51:52 IP:203.75.xxx.xxx 訂閱
這個我試過
不論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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-05-11 23:43:16 IP:122.116.xxx.xxx 訂閱
感謝您的回覆....

但是即使不用refresh...CppWebBrowser->Navigate(); 也沒辦法真的重整

我也試過用個timer去跑,仍然不行

昨天臨時的作法是,另外寫一個程式,負責跑timer,每一秒就執行一次原本這隻程式

但是今天發現沒執行,才發現我啟動程式的系統排程時間設錯

但這畢竟不是個好辦法

難道CppWebBrowser偵測到開啟過的網頁都只是假的重整嗎?
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-05-12 08:00:54 IP:203.75.xxx.xxx 訂閱
Indy也可以做這個工作
但Indy8也一樣會有假動作的問題

Indy9和10沒試過,哈!
===================引 用 GGL 文 章===================
感謝您的回覆....

但是即使不用refresh...CppWebBrowser->Navigate();也沒辦法真的重整

我也試過用個timer去跑,仍然不行

昨天臨時的作法是,另外寫一個程式,負責跑timer,每一秒就執行一次原本這隻程式

但是今天發現沒執行,才發現我啟動程式的系統排程時間設錯

但這畢竟不是個好辦法

難道CppWebBrowser偵測到開啟過的網頁都只是假的重整嗎?
GGL
資深會員


發表:104
回覆:600
積分:335
註冊:2006-11-05

發送簡訊給我
#5 引用回覆 回覆 發表時間:2010-05-12 23:33:40 IP:122.116.xxx.xxx 訂閱
真奇怪,那用cppwebbrowser的user,不就看網頁都只能看到第一次開的

太詭異了吧,以前都沒注意到

要不是要模擬網頁click,我就直接用idhttp去抓資料就好了

TWY
高階會員


發表:2
回覆:133
積分:152
註冊:2009-09-02

發送簡訊給我
#6 引用回覆 回覆 發表時間:2010-05-14 10:10:52 IP:59.120.xxx.xxx 訂閱
提供一個重要觀念與小技巧參考。
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2010-05-14 23:07:46 IP:122.116.xxx.xxx 訂閱
原來如此,難怪我今天用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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2010-05-15 00:06:51 IP:122.116.xxx.xxx 訂閱
關掉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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2010-05-15 09:42:49 IP:220.132.xxx.xxx 訂閱
抱歉沒講很清楚。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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2010-05-15 12:08:01 IP:122.116.xxx.xxx 訂閱
謝謝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這東西我誤解有問題?謝謝


系統時間:2024-04-26 12:42:32
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!