線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:6007
推到 Plurk!
推到 Facebook!

想要讓WebBrowser自動click網頁上的連結或按鈕

尚未結案
derekyppp
一般會員


發表:16
回覆:33
積分:9
註冊:2004-02-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-26 20:38:47 IP:211.74.xxx.xxx 未訂閱
想要讓WebBrowser自動click網頁上的連結或按鈕 剛開始用模擬鍵盤事件來做(用tab來改變位置 用enter來進入) 可是發現因為網頁的內容有變動 程式在動作之後就亂錯(完全沒有達到想要按的那個按鈕或連結@@”) 之前有在網裡找到一些相關文章 不過大多都是delphi的><” 不然是用外部程式(ie)來控制的 我想知道bcb也可以這麼做嗎? 謝謝^_^
nlj859
資深會員


發表:139
回覆:375
積分:322
註冊:2004-03-20

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-26 21:24:07 IP:163.28.xxx.xxx 未訂閱
Hello derekyppp,    只要你知道網址,瀏覽就可以了. 不過,我不太清楚你所說的"自動click網頁上的連結或按鈕"是怎樣的動作? 是每格一段時間refresh一次嗎?還是.... 希望我沒有誤解你的意思. 是否可再詳細描述一下呢?    *改用自己的按鈕去連結一個網址
CppWebBrowser1->Navigate((WideString)"http://www.aaa.com.tw/a1/s2");
*固定一段時間去重新瀏覽
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  CppWebBrowser1->Navigate((WideString)"http://www.aaa.com.tw/a1/s2");
}
發表人 - nlj859 於 2004/08/26 21:26:24
derekyppp
一般會員


發表:16
回覆:33
積分:9
註冊:2004-02-20

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-26 22:04:13 IP:211.74.xxx.xxx 未訂閱
恩~我已經懂得如何用webbrower讀取一個網頁了 我是想利用程式來點網頁裡面某些連結或按鈕 像在http://tw.yahoo.com/裡面的『網站登錄』這個連結 點完後,再接著自動點選裡面的『優先登錄』 我先前有用過tab鍵+enter鍵的方式來做 不過效果很不理想 請問在bcb中有辦法可以做出來嗎 (我有在站裡找到delphi類似的文件,但bcb不知道也可以做到嗎)
nlj859
資深會員


發表:139
回覆:375
積分:322
註冊:2004-03-20

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-26 22:24:41 IP:163.28.xxx.xxx 未訂閱
個人覺得使用tab enter來處理要按下某個item或是你根據上面的連結名稱或是網址去選擇都是不好,就像你說的網站如果位置換了,你怎麼知道要按幾下tab?如果連結名稱或是網址變了,那不就找不到了嗎? 我想這沒有絕對好的方法吧,端看個人要怎麼使用. 個人見解,期待有高手出面提供好方法或技巧.
MyYunSong
一般會員


發表:10
回覆:18
積分:5
註冊:2004-08-20

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-08-30 17:43:06 IP:61.235.xxx.xxx 未訂閱
我最近也在研究這個問題。先給你個代碼: 這就是模擬點擊的部份,有興趣我們再互相學習一下 void __fastcall TForm1::Button3Click(TObject *Sender) {         _di_IDispatch disp;         System::DelphiInterface htmldoc2; System::DelphiInterface htmlelem; System::DelphiInterface htmlelemcol; IDispatch *ppvdispOption; WideString ws,ws1; // ws.SetLength(10240); disp = this->CppWebBrowser1->Document; disp->QueryInterface(IID_IHTMLDocument2,(void**)&htmldoc2); htmldoc2->get_all(&htmlelemcol); HRESULT hResult; System::DelphiInterface htmlresult; VARIANT index; index.vt=VT_I4; ///////////////////////////////////////////////////////-------------- //這就是要模擬點擊的html ws1.operator =("<INPUT class=v02 type=button value=搜索 name=B1>"); /////////////////////////////---------------------------------------- long a,l; htmlelemcol->get_length(&a); ws.SetLength(10240); for(l=0;litem(index,index,&ppvdispOption); if FAILED(hResult) return; hResult =ppvdispOption->QueryInterface( IID_IHTMLElement,(void**)&htmlresult); htmlresult->get_outerHTML(&ws); if(ws==ws1) { break; } } if(l>=a) { ShowMessage("找不到"); return; } htmlresult->click(); // htmlresult->Release(); }
xfile
初階會員


發表:21
回覆:80
積分:25
註冊:2004-10-02

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-10-27 11:03:10 IP:220.130.xxx.xxx 未訂閱
引言: 我最近也在研究這個問題。先給你個代碼: 這就是模擬點擊的部份,有興趣我們再互相學習一下
void __fastcall TForm1::Button3Click(TObject *Sender)
{
        _di_IDispatch disp;
        System::DelphiInterface htmldoc2;
        System::DelphiInterface htmlelem;
        System::DelphiInterface htmlelemcol;
        IDispatch *ppvdispOption;
        WideString ws,ws1;
//        ws.SetLength(10240);
        disp = this->CppWebBrowser1->Document;
        disp->QueryInterface(IID_IHTMLDocument2,(void**)&htmldoc2);
        htmldoc2->get_all(&htmlelemcol);
        HRESULT hResult;
        System::DelphiInterface htmlresult;
        VARIANT index;
        index.vt=VT_I4;    ///////////////////////////////////////////////////////--------------
//這就是要模擬點擊的html
        ws1.operator =("<INPUT class=v02  type=button value=搜索 name=B1>");
/////////////////////////////----------------------------------------            long a,l;
        htmlelemcol->get_length(&a);
        ws.SetLength(10240);
        for(l=0;litem(index,index,&ppvdispOption);
                if FAILED(hResult) return;
                hResult =ppvdispOption->QueryInterface( IID_IHTMLElement,(void**)&htmlresult);
                htmlresult->get_outerHTML(&ws);
                if(ws==ws1)
                {
                        break;
                }
        }
        if(l>=a)
        {
                ShowMessage("找不到");
                return;
        }
        htmlresult->click();
//                htmlresult->Release();
}    
請加 code 和 /code ,難怪我會 compile 錯誤 -_-
artist1002
高階會員


發表:2
回覆:155
積分:151
註冊:2002-09-26

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-10-28 21:57:55 IP:210.58.xxx.xxx 未訂閱
我也來試試 首先假設你的CppWebBrowser1已經瀏覽http://tw.yahoo.com且下載完成 以下的程式碼是找出所有的連結中文字是"網站登錄"的連結,並且按下Click
        Variant disp,alllinks,eachlink;
        int linkcount;            disp = CppWebBrowser1->Document;
        alllinks = disp->OlePropertyGet("links"); //取得所有的連結
        linkcount = alllinks.OlePropertyGet("length"); //取得連結的數量
        for (int i=0;i<linkcount;i  )
        {
                eachlink = linkall.OleFunction("item",i); //依序取得每一個連結
                if (eachlink.OlePropertyGet("innerText")=="網站登錄") //判斷<a>中的文字
                {
                        eachlink.OleFunction("click"); //按下連結
                        break; //記得離開for迴圈
                }
        }
至於自動點選的部份可以寫在CppWebBrowser1的OnDocumentComplete事件中 自己要判斷進行到哪一個部份 可以用CppWebBrowser1->LocationURL來判斷目前的網址 也可以判斷網頁內的內容來看進行到哪一個部份。 發表人 - artist1002 於 2004/10/28 22:02:41
derekyppp
一般會員


發表:16
回覆:33
積分:9
註冊:2004-02-20

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-10-29 10:30:29 IP:218.168.xxx.xxx 未訂閱
artist1002大大你好 我試著用你寫的那段程式,去編譯 但是卻出現下面的錯誤耶… [C Error] Unit1.cpp(25): E2288 Pointer to structure required on left side of -> or ->* 這個意思是不是要告訴我說 alllinks = disp->OlePropertyGet("links"); //取得所有的連結 ↑這是第25行 要把它改成指標* 可是我前加*號 後加*後 都還不是行~"~
derekyppp
一般會員


發表:16
回覆:33
積分:9
註冊:2004-02-20

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-10-29 10:55:50 IP:218.168.xxx.xxx 未訂閱
artist1002大大 我剛剛又再試一次,這次已經正常可以運作了 可是我還有一個問題想問耶^^" 就是,如果我現在要點選的是網頁上的button呢 radio button 要在程式中修改哪一個部份呢?
artist1002
高階會員


發表:2
回覆:155
積分:151
註冊:2002-09-26

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-10-29 23:41:06 IP:210.58.xxx.xxx 未訂閱
引言: artist1002大大 我剛剛又再試一次,這次已經正常可以運作了 可是我還有一個問題想問耶^^" 就是,如果我現在要點選的是網頁上的button呢 radio button 要在程式中修改哪一個部份呢?
這個就是要看DHTML了 http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/objects/obj_document.asp 我們可以把CppWebBrowser1->Document當作是DHTML的document物件 接著就參考MSDN的文件尋訪內容,遇到Attributes/Properties就用OlePropertyGet來讀,用OlePropertySet來寫 遇到Collections也是用OlePropertyGet來取得 遇到Methods就用OleFunction來做 如果要點選的是網頁上的button,先看網頁原始碼的input button有沒有設定id或是name,有的話會比較簡單。 先假設有name為button1,以下的是按下button
        Variant disp,dhtmlbutton;
        
        disp = CppWebBrowser1->Document;
        dhtmlbutton = disp.OleFunction("getElementsByName","button1"); //取得button1按鈕
        if (!dhtmlbutton->IsNull()) //如果有找到按鈕
                dhtmlbutton->OleFunction("click"); //按下按鈕
如果有Id的話只要改成就可以
        dhtmlbutton = disp.OleFunction("getElementById","buttonId"); //取得button1按鈕
最糟的狀況是沒有name也沒有Id的狀況 這個時候就需要取得所有的input的collections然後一個一個比較,看哪個是你要的 可以比較value或是其他的部份. 假設button的value是"搜尋"
        Variant disp,allbuttons,eachbutton;
        int buttoncount;            disp = CppWebBrowser1->Document;
        allbuttons = disp.OleFunction("getElementsByTagName","input"); //取得所有tag是input的集合
        buttoncount = allbuttons.OlePropertyGet("length"); //取得集合的數量
        for (int i=0;i<buttoncount;i  )
        {
                eachbutton = allbuttons.OleFunction("item",i); //依序取得每一個連結
                if (eachbutton.OlePropertyGet("value")=="搜尋") //判斷value的文字
                {
                        eachbutton.OleFunction("click"); //按下按鈕
                        break; //記得離開for迴圈
                }
        }    </pre>    另外如果只是要讓form作submit的動作
也可以找form然後下submit的Function     
        
artist1002
高階會員


發表:2
回覆:155
積分:151
註冊:2002-09-26

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-10-29 23:43:33 IP:210.58.xxx.xxx 未訂閱
引言:
引言: artist1002大大 我剛剛又再試一次,這次已經正常可以運作了 可是我還有一個問題想問耶^^" 就是,如果我現在要點選的是網頁上的button呢 radio button 要在程式中修改哪一個部份呢?
這個就是要看DHTML了 http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/objects/obj_document.asp 我們可以把CppWebBrowser1->Document當作是DHTML的document物件 接著就參考MSDN的文件尋訪內容,遇到Attributes/Properties就用OlePropertyGet來讀,用OlePropertySet來寫 遇到Collections也是用OlePropertyGet來取得 遇到Methods就用OleFunction來做 如果要點選的是網頁上的button,先看網頁原始碼的input button有沒有設定id或是name,有的話會比較簡單。 先假設有name為button1,以下的是按下button
        Variant disp,dhtmlbutton;
        
        disp = CppWebBrowser1->Document;
        dhtmlbutton = disp.OleFunction("getElementsByName","button1"); //取得button1按鈕
        if (!dhtmlbutton->IsNull()) //如果有找到按鈕
                dhtmlbutton->OleFunction("click"); //按下按鈕
如果有Id的話只要改成就可以
        dhtmlbutton = disp.OleFunction("getElementById","buttonId"); //取得button1按鈕
最糟的狀況是沒有name也沒有Id的狀況 這個時候就需要取得所有的input的collections然後一個一個比較,看哪個是你要的 可以比較value或是其他的部份. 假設button的value是"搜尋"
        Variant disp,allbuttons,eachbutton;
        int buttoncount;            disp = CppWebBrowser1->Document;
        allbuttons = disp.OleFunction("getElementsByTagName","input"); //取得所有tag是input的集合
        buttoncount = allbuttons.OlePropertyGet("length"); //取得集合的數量
        for (int i=0;i<buttoncount;i  )
        {
                eachbutton = allbuttons.OleFunction("item",i); //依序取得每一個input
                if (eachbutton.OlePropertyGet("value")=="搜尋") //判斷value的文字
                {
                        eachbutton.OleFunction("click"); //按下按鈕
                        break; //記得離開for迴圈
                }
        }    </pre>    另外如果只是要讓form作submit的動作
也可以找form然後下submit的Function     
baryan
一般會員


發表:0
回覆:3
積分:0
註冊:2004-12-01

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-02-19 17:06:42 IP:211.76.xxx.xxx 未訂閱
請問,這行有問題嗎? if (eachbutton.OlePropertyGet("value")=="搜尋") //判斷value的文字 因為我一編譯就錯誤:『 E2015 Ambiguity between 'function1' and 'function2' 』 TKS
系統時間:2024-05-13 4:12:46
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!