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

webBrowser1自動換頁問題

答題得分者是:JamesJuan
qoohhooq
一般會員


發表:1
回覆:3
積分:0
註冊:2015-11-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2015-11-23 11:42:09 IP:59.120.xxx.xxx 訂閱
板上各位高手,小弟需要各位的協助,想請問一下,小弟的code該如何改(少了什麼),才能達到小弟的需求呢?

主要兩個function:(1) gotowebmail(); (2) login()

========================gotowebmail()========================
void gotowebmail()
{
Sleep(2000);
HtmlDocument^ htmlmain = webBrowser1->Document;

Sleep(2000);
//按下Gmail
for(int i = 0;i < htmlmain->All->Count;i )
{
HtmlElement^ he = htmlmain->All[i];
if(he->TagName->Contains("SPAN"))
{
if (he->InnerText == "Gmail")
{
he->InvokeMember("Click");
break;
}
}
}
}
============================login()============================
void login()
{
String^ useraccount;

String^ userpassword;

useraccount = btn_account->Text;

userpassword = btn_password->Text;

//輸入帳密
HtmlDocument^ htmlmain_1 = webBrowser1->Document;

webBrowser1->Document->GetElementById("Email")->SetAttribute("value",useraccount);

webBrowser1->Document->GetElementById("Passwd")->SetAttribute("value",userpassword);

for(int y = 0;y < htmlmain_1->All->Count;y )
{
HtmlElement^ he_1 = htmlmain_1->All[y];
if(he_1->TagName->Contains("INPUT"))
{
if(he_1->GetAttribute("value") == "登入")
{
he_1->InvokeMember("Click");

break;
}
}
}
}
==============================================================

主線程執行Excuit():

void Excuit()
{
gotowebmail();
Sleep(5000);
login();
}
==============================================================
但問題會出現在,當執行login()的function時,會fail在 webBrowser1->Document->GetElementById("Email")->SetAttribute("value",useraccount);
因為感覺webBrowser1並沒有轉跳到要輸入帳號密碼的那一個page.基本上這兩個function都是沒問題的!因為分別寫成兩個botton執行是沒問題的.
當按下第一個botton可以看到webBrowser1物件有跳到要輸入帳號密碼那個頁面,然後按下第二個botton就可以進入.
可是我把他寫在同一個function裡面,然後讓我的程式直接去跑就會fail.請問我少了什麼動作造成轉跳沒有成功而造成輸入帳密有問題呢?
或是webBrowser1在第一個function被占用沒釋放嗎?如果是沒有釋放我該怎麼釋放呢?

JamesJuan
中階會員


發表:2
回覆:76
積分:80
註冊:2003-04-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2015-11-23 12:17:38 IP:60.250.xxx.xxx 未訂閱
依據之前使用經驗的推測...應該是執行 gotowebmail 後,尚未等到網頁完全載入,就要執行 login 所導致
您有提到「分別寫成兩個botton執行是沒問題的」
如果 button1 按下去,馬上去按 button2
應該一樣會報錯
qoohhooq
一般會員


發表:1
回覆:3
積分:0
註冊:2015-11-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2015-11-23 12:40:26 IP:59.120.xxx.xxx 訂閱

===================引 用 JamesJuan 文 章===================
依據之前使用經驗的推測...應該是執行 gotowebmail 後,尚未等到網頁完全載入,就要執行 login 所導致
您有提到「分別寫成兩個botton執行是沒問題的」
如果 button1 按下去,馬上去按 button2
應該一樣會報錯



您的推測我當初也覺得可能會發生!所以您可以看上面的程式碼!主線程的部分,我那邊有Sleep(5000);也許您會認為5秒不夠,我也在code裡面改成10秒或是20秒!基本上問題還是一樣耶,所以應該不太像是您認為delay time不夠的問題.不過非常感謝您熱心的回答我.

我們再看看有沒有其他人遇到同樣的問題或是有此經驗的高手能幫我解決這個問題!謝謝您.
JamesJuan
中階會員


發表:2
回覆:76
積分:80
註冊:2003-04-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2015-11-23 12:54:40 IP:60.250.xxx.xxx 未訂閱
sleep 是沒有用的
sleep 執行下去,主線程會卡住,webBrowser 也做不了事情,所以不管睡再久都沒有用
qoohhooq
一般會員


發表:1
回覆:3
積分:0
註冊:2015-11-23

發送簡訊給我
#5 引用回覆 回覆 發表時間:2015-11-23 13:35:23 IP:59.120.xxx.xxx 訂閱

===================引 用 JamesJuan 文 章===================
sleep 是沒有用的
sleep 執行下去,主線程會卡住,webBrowser 也做不了事情,所以不管睡再久都沒有用


=======================================================
恩!是的,謝謝您!Sleep的確是會造成,主線程卡住,webBrowser的確是做不了事情!
所以我有在宣告:

public: void loading()
{
while (!(webBrowser1->ReadyState == WebBrowserReadyState::Complete))
{
Application::DoEvents();
}

}

用loading()的function作為判斷是否有Web是否有完成讀取!但是,好像還是不行,不知道是否還有什麼方式可以達成呢?可以讓第一個轉跳過去後,等待web換到login那個頁面讓第二個function可以抓到account與password呢?

感謝JamesJuan.
qoohhooq
一般會員


發表:1
回覆:3
積分:0
註冊:2015-11-23

發送簡訊給我
#6 引用回覆 回覆 發表時間:2015-11-23 23:25:23 IP:1.163.xxx.xxx 訂閱
非常感謝JamesJuan,的確是時序問題!我後來解決掉這個問題了!非常的感謝您的指教!
系統時間:2024-04-20 10:36:07
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!