
初心者的質問で申し訳ございませんが、回答していただければ幸いです。
https://teratail.com/questions/160352
上記の質問で無限ループ処理はよくないと回答をいただき、一般的にはDocumentCompletedを利用すればよいことを知りました。
そこで下記のようなDocumentCompletedを利用したものを記述しているのですが、
思った動作をしていません。
理想動作は、
接続先URL1にアクセス→接続先URL1が表示が完了してから
else if (label1.Text == "接続先URL1接続完了")
の部分を実行させたいです。
しかし、完了していない状態のところで動き、
HtmlElement id = elements.GetElementsByName("userName")[0];の部分で下記エラー発生しています。
System.ArgumentOutOfRangeException: ''0' の値は 'index' に対して有効ではありません。'index' は 0 と -1 の間でなければなりません。
パラメーター名:index'
ページによっては複数回DocumentCompletedが発生するものがあると聞きましたが、
その場合の記述例を教えていただけないでしょうか。
また、その他良い記述方法等ございましたらアドバイスお願いいたします。
C#
1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Net; 8using System.Net.Security; 9using System.Runtime.InteropServices; 10using System.Security.Cryptography.X509Certificates; 11using System.Text; 12using System.Threading; 13using System.Threading.Tasks; 14using System.Windows.Forms; 15namespace WindowsFormsApp8 16{ 17 public partial class Form1 : Form 18 { 19 public Form1() 20 { 21 InitializeComponent(); 22 } 23 private void button1_Click(object sender, EventArgs e) 24 { 25 label1.Text = "接続先URL1"; 26 label1.Refresh(); 27 string testurl = "接続URL"; 28 webBrowser1.Navigate(testurl); 29 } 30 string URL_ST = "検索したいURL1"; 31 string URL_TH = "検索したいURL2"; 32 string URL_NE = "検索したいURL3"; 33 string URL_SE = "検索したいURL4"; 34 private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 35 { 36 try 37 { 38 if (e.Url.ToString() == URL_ST) 39 { 40 //label1の表示変更 41 label1.Text = "ログイン処理"; 42 label1.Refresh(); 43 //1番目フレーム内のNameを取得 44 HtmlWindow iframe = webBrowser1.Document.Window.Frames[0]; 45 HtmlElementCollection elements = iframe.Document.All; 46 HtmlElement id = elements.GetElementsByName("userName")[0]; 47 HtmlElement pw = elements.GetElementsByName("pwd")[0]; 48 //ID・passを入力 49 id.InnerText = "admin"; 50 pw.InnerText = "password"; 51 //Submitボタンをクリック 52 HtmlElement login = elements.GetElementsByName("Submit")[0]; 53 login.InvokeMember("click"); 54 } 55 else if (e.Url.ToString() == URL_NE) 56 { 57 webBrowser1.Navigate("接続URL2"); 58 } 59 else if (e.Url.ToString() == URL_TH) 60 { 61 string filepath = (保存先); 62 // クッキーを取得する。 63 string cookieStr = webBrowser1.Document.Cookie; 64 // WebClientを生成する。 65 WebClient wc = new WebClient(); 66 Encoding enc = Encoding.UTF8; 67 // WebClientのヘッダ設定を行う。 68 wc.Headers[HttpRequestHeader.Cookie] = cookieStr; 69 label1.Text = "ダウンロード中"; 70 label1.Refresh(); 71 wc.DownloadFile("段ロードURL", filepath); 72 wc.Dispose(); 73 label1.Text = "ダウンロード完了"; 74 label1.Refresh(); 75 } 76 } 77 catch (Exception) 78 { 79 label1.Text = "例外の発生"; 80 label1.Refresh(); 81 } 82 } 83 } 84}
追記
追記
上記に変更したところ、ダウンロードは出来るようになりました。
このソースで記述的におかしい・こうしたほうが良いなどありましたらアドバイスお願いします。








回答3件
あなたの回答
tips
プレビュー