質問者
C#でのWebブラウザでのWebアクセスについての質問です。

質問
-
VisualC#2010、Windows7での動作について質問があります。
(1)このmsdnへのログインを自動化したいと考えました。
string msdnloginURL = "https://login.live.com/login.srf?wa=wsignin1.0&wtrealm=social.msdn.microsoft.com&wreply=https%3a%2f%2fsocial.msdn.microsoft.com%2fForums%2fja-JP%2fcsharpgeneralja%2fthreads%3fstoAI%3d10&wp=MBI_FED_SSL&wlcxt=Msdn%24Msdn%24Msdn";
string[] msdnlogin = { "login", "passwd" };
string[] msdnID = { "ID", "PW" };private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) {
string URL = webBrowser.Url.ToString();
HtmlElementCollection HE = webBrowser.Document.All;
for (int i = 0; i < msdnlogin.Length; i++){
HtmlElementCollection logins = HE.GetElementsByName(msdnlogin[i]);
logins[0].InnerText = msdnID[i];
}
HtmlElementCollection submitbutton = HE.GetElementsByName("SI");
if (submitbutton.Count != 0) submitbutton[0].InvokeMember("click");
}のようにコードを書いたところ、IDは入ったのですが、PWを入力できません。
HtmlElement password = webBrowser.Document.GetElementById("idDiv_PWD_PasswordTb");
password.InnerText = msdnID[1];HtmlElementCollection inputs = webBrowser.Document.GetElementsByTagName("input");
foreach (HtmlElement input in inputs)
if (input.OuterText.Contains("passwd")) input.InnerText = msdnID[1];などのように、IDやTagNameで検索してもダメでした。
どのようにすればよいかご教示いただけないでしょうか。(2)港区の図書館の検索を自動化しようとしています。
http://www.lib.city.minato.tokyo.jp/j/searchsubmenu.html
にアクセスして、文字を入力するところはほぼ上記と同様にしてできたのですが、検索語がヒットしないときに、「Webページからのメッセージ 該当する書誌がありません」というポップアップウィンドウが開きます。
このポップアップウィンドウをキャンセル方法はありませんか?this.webBrowser.NewWindow += new CancelEventHandler(webBrowser_NewWindow);
というイベントを作り、
void webBrowser_NewWindow(object sender, CancelEventArgs e){
WebBrowser wb = sender as WebBrowser;
string eventstring = e.ToString();
}
のようにしてイベントをキャンセルできるのか確かめてみたのですが、そもそもこのイベントが発火しないみたいです。
よろしくご教示ください。- 編集済み NewTower 2012年7月22日 12:38 mistake
すべての返信
-
> のようにコードを書いたところ、IDは入ったのですが、PWを入力できません。
不必要に複雑なコードを書いているからではないですか?
login, passwd, SI という name 属性が、動的に変わったり、一意でないということ
でなければ以下のようにしてログインできるはずです。HtmlElement login = webBrowser1.Document.All.GetElementsByName("login")[0]; HtmlElement passwd = webBrowser1.Document.All.GetElementsByName("passwd")[0]; login.InnerText = "ユーザー ID(メールアドレス)"; passwd.InnerText = "パスワード"; HtmlElement signin = webBrowser1.Document.All.GetElementsByName("SI")[0]; signin.InvokeMember("click");
> このポップアップウィンドウをキャンセル方法はありませんか?
こちらの方は、佐祐理さんが書かれてているように、JavaScript の alert なので、
JavaScript を無効にする以外方法はなんさそうです。WebBrowser でどうすれば JavaScript が無効にできるかは、自分は分かりません。
-
New Towerさん
お疲れ様です。曹です。
Quiz1ですが、Live IDで登録する場合、Microsoftのauthorization codeが必要らしいです。
詳しくは下記の資料(日本語)をご参照ください。
http://msdn.microsoft.com/ja-jp/library/hh243649.aspx
Source Code例があります。
http://social.msdn.microsoft.com/Forums/en-US/messengerconnect/thread/cd769425-6332-4310-85d9-3d6ceafa10b7/
以上です。- 回答の候補に設定 山本春海 2012年8月15日 7:38
-
.NET Framework の WebBrowser コントロールに JavaScript を無効
にするような機能は見つかりませんでしたが、ググって調べたら以下
のページが見つかりました。Microsoft Web Browserコントロールのセキュリティを制御する
http://codezine.jp/article/detail/246COM 相互運用で提供されている機能を利用して COM ラッパーを生成
し、それを通じて ActiveX を操作できるように WebBrowser コント
ロールを拡張すれば、JavaScript をプログラムで無効にすることは
可能なようです。(検証はしてませんが)でも、JavaScript を無効にすると、そのページ全体がうまく動かな
くなるかの知れませんので、注意してください。 -
ピンポイントで、よくわかっていなくて回答します。
alert関数を無効化したいだけなら、ページ遷移後にalert関数を上書きで定義してしまえばいいだけかもしれません。
Microsoft.mshtmlへの参照が必要です。
webBrowser1.Navigated += (_s, _e) => { var w = (WebBrowser) _s; var label = w.Document.CreateElement("label"); label.Id = "message"; w.Document.Body.AppendChild(label); var script = w.Document.CreateElement("script"); var scriptDom = (IHTMLScriptElement) script.DomElement; scriptDom.text = @"function alert(message) { document.getElementById('message').innerHTML = message; }"; w.Document.Body.AppendChild(script); };
-
webbrowser コントロールの alert 制御については
> webBrowserでjavascriptで書かれたalertを表示させない方法はありませんか
> http://social.msdn.microsoft.com/Forums/ja-JP/csharpgeneralja/thread/a82432f4-145f-452f-b1a7-ed4defe91a85こちらにもいくつか話題があります。
- 編集済み K. Takaoka 2012年7月25日 3:54
- 回答の候補に設定 山本春海 2012年8月15日 7:38