質問編集履歴

5

意図的な内容抹消の取り消し

2018/11/30 01:23

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- 諸事情より削除させいただきます。
1
+ webBrowserコントロールのDocumentCompletedつい
test CHANGED
@@ -1,35 +1,211 @@
1
+ 初心者的質問で申し訳ございませんが、回答していただければ幸いです。
2
+
3
+ https://teratail.com/questions/160352
4
+
5
+ 上記の質問で無限ループ処理はよくないと回答をいただき、一般的にはDocumentCompletedを利用すればよいことを知りました。
6
+
7
+ そこで下記のようなDocumentCompletedを利用したものを記述しているのですが、
8
+
9
+ 思った動作をしていません。
10
+
11
+ 理想動作は、
12
+
13
+ 接続先URL1にアクセス→接続先URL1が表示が完了してから
14
+
15
+ else if (label1.Text == "接続先URL1接続完了")
16
+
1
- 諸事情により削除させただきます。
17
+ の部分を実行させす。
18
+
2
-
19
+ しかし、完了していない状態のところで動き、
20
+
21
+ HtmlElement id = elements.GetElementsByName("userName")[0];の部分で下記エラー発生しています。
22
+
23
+ System.ArgumentOutOfRangeException: ''0' の値は 'index' に対して有効ではありません。'index' は 0 と -1 の間でなければなりません。
24
+
25
+ パラメーター名:index'
26
+
27
+ ページによっては複数回DocumentCompletedが発生するものがあると聞きましたが、
28
+
29
+ その場合の記述例を教えていただけないでしょうか。
30
+
31
+ また、その他良い記述方法等ございましたらアドバイスお願いいたします。
32
+
33
+ ```C#
34
+
35
+ using System;
36
+
37
+ using System.Collections.Generic;
38
+
39
+ using System.ComponentModel;
40
+
41
+ using System.Data;
42
+
43
+ using System.Drawing;
44
+
45
+ using System.Linq;
46
+
47
+ using System.Net;
48
+
49
+ using System.Net.Security;
50
+
51
+ using System.Runtime.InteropServices;
52
+
53
+ using System.Security.Cryptography.X509Certificates;
54
+
55
+ using System.Text;
56
+
57
+ using System.Threading;
58
+
59
+ using System.Threading.Tasks;
60
+
61
+ using System.Windows.Forms;
62
+
63
+ namespace WindowsFormsApp8
64
+
65
+ {
66
+
67
+ public partial class Form1 : Form
68
+
69
+ {
70
+
71
+ public Form1()
72
+
73
+ {
74
+
75
+ InitializeComponent();
76
+
77
+ }
78
+
79
+ private void button1_Click(object sender, EventArgs e)
80
+
81
+ {
82
+
83
+ label1.Text = "接続先URL1";
84
+
85
+ label1.Refresh();
86
+
87
+ string testurl = "接続URL";
88
+
89
+ webBrowser1.Navigate(testurl);
90
+
91
+ }
92
+
93
+ string URL_ST = "検索したいURL1";
94
+
95
+ string URL_TH = "検索したいURL2";
96
+
97
+ string URL_NE = "検索したいURL3";
98
+
99
+ string URL_SE = "検索したいURL4";
100
+
101
+ private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
102
+
103
+ {
104
+
105
+ try
106
+
107
+ {
108
+
109
+ if (e.Url.ToString() == URL_ST)
110
+
111
+ {
112
+
113
+ //label1の表示変更
114
+
115
+ label1.Text = "ログイン処理";
116
+
117
+ label1.Refresh();
118
+
119
+ //1番目フレーム内のNameを取得
120
+
121
+ HtmlWindow iframe = webBrowser1.Document.Window.Frames[0];
122
+
123
+ HtmlElementCollection elements = iframe.Document.All;
124
+
125
+ HtmlElement id = elements.GetElementsByName("userName")[0];
126
+
127
+ HtmlElement pw = elements.GetElementsByName("pwd")[0];
128
+
129
+ //ID・passを入力
130
+
131
+ id.InnerText = "admin";
132
+
133
+ pw.InnerText = "password";
134
+
135
+ //Submitボタンをクリック
136
+
137
+ HtmlElement login = elements.GetElementsByName("Submit")[0];
138
+
139
+ login.InvokeMember("click");
140
+
141
+ }
142
+
143
+ else if (e.Url.ToString() == URL_NE)
144
+
145
+ {
146
+
147
+ webBrowser1.Navigate("接続URL2");
148
+
149
+ }
150
+
151
+ else if (e.Url.ToString() == URL_TH)
152
+
153
+ {
154
+
155
+ string filepath = (保存先);
156
+
157
+ // クッキーを取得する。
158
+
159
+ string cookieStr = webBrowser1.Document.Cookie;
160
+
161
+ // WebClientを生成する。
162
+
163
+ WebClient wc = new WebClient();
164
+
165
+ Encoding enc = Encoding.UTF8;
166
+
3
- ````````````````````````ここに言語入力
167
+ // WebClientのヘッダ設定行う。
168
+
4
-
169
+ wc.Headers[HttpRequestHeader.Cookie] = cookieStr;
170
+
171
+ label1.Text = "ダウンロード中";
172
+
173
+ label1.Refresh();
174
+
175
+ wc.DownloadFile("段ロードURL", filepath);
176
+
5
- ここに言語を入力
177
+ wc.Dispose();
178
+
179
+           label1.Text = "ダウンロード完了";
180
+
181
+ label1.Refresh();
182
+
183
+ }
184
+
185
+ }
186
+
187
+ catch (Exception)
188
+
189
+ {
190
+
191
+ label1.Text = "例外の発生";
192
+
193
+ label1.Refresh();
194
+
195
+ }
196
+
197
+ }
198
+
199
+ }
200
+
201
+ }
6
202
 
7
203
  ```
8
204
 
205
+ 追記
206
+
9
- ここに言語を入力
207
+ ### 追記
10
-
11
- ```
208
+
12
-
13
- 言語を入力
209
+ 上記に変更したとろ、ダウンロードは出来るようなりました。
14
-
15
- ```
210
+
16
-
17
- ここに言語を入力
211
+ のソースで記述的におかしい・うしたほうが良いなどありましたらアドバイスお願いします。
18
-
19
- ```
20
-
21
- ここに言語を入力
22
-
23
- ```
24
-
25
- ここに言語を入力
26
-
27
- ```
28
-
29
- ここに言語を入力
30
-
31
- ```
32
-
33
- コード
34
-
35
- ```

4

変更

2018/11/30 01:23

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- webBrowserコントロールのDocumentCompleted
1
+ 諸事情より削除させてただきます。
test CHANGED
@@ -1,247 +1,35 @@
1
- 初心者的質問で申し訳ございまんが、回答していただければ幸いです。
1
+ 諸事情により削除させていただきます。
2
2
 
3
- https://teratail.com/questions/160352
3
+ ````````````````````````ここに言語を入力
4
4
 
5
- 上記の質問で無限ループ処理はよくないと回答をいただき、一般的にはDocumentCompletedを利用すればよいことを知りました。
6
-
7
-
8
-
9
- そこで下記のようなDocumentCompletedを利用したものを記述しているのですが、
10
-
11
- 思った動作していません。
5
+ ここに言語入力
12
-
13
-
14
-
15
- 理想動作は、
16
-
17
- 接続先URL1にアクセス→接続先URL1が表示が完了してから
18
-
19
- else if (label1.Text == "接続先URL1接続完了")
20
-
21
- の部分を実行させたいです。
22
-
23
-
24
-
25
- しかし、完了していない状態のところで動き、
26
-
27
- HtmlElement id = elements.GetElementsByName("userName")[0];の部分で下記エラー発生しています。
28
-
29
- System.ArgumentOutOfRangeException: ''0' の値は 'index' に対して有効ではありません。'index' は 0 と -1 の間でなければなりません。
30
-
31
- パラメーター名:index'
32
-
33
-
34
-
35
- ページによっては複数回DocumentCompletedが発生するものがあると聞きましたが、
36
-
37
- その場合の記述例を教えていただけないでしょうか。
38
-
39
- また、その他良い記述方法等ございましたらアドバイスお願いいたします。
40
-
41
- ```C#
42
-
43
- using System;
44
-
45
- using System.Collections.Generic;
46
-
47
- using System.ComponentModel;
48
-
49
- using System.Data;
50
-
51
- using System.Drawing;
52
-
53
- using System.Linq;
54
-
55
- using System.Net;
56
-
57
- using System.Net.Security;
58
-
59
- using System.Runtime.InteropServices;
60
-
61
- using System.Security.Cryptography.X509Certificates;
62
-
63
- using System.Text;
64
-
65
- using System.Threading;
66
-
67
- using System.Threading.Tasks;
68
-
69
- using System.Windows.Forms;
70
-
71
-
72
-
73
- namespace WindowsFormsApp8
74
-
75
- {
76
-
77
- public partial class Form1 : Form
78
-
79
- {
80
-
81
- public Form1()
82
-
83
- {
84
-
85
- InitializeComponent();
86
-
87
- }
88
-
89
-
90
-
91
- private void button1_Click(object sender, EventArgs e)
92
-
93
- {
94
-
95
- label1.Text = "接続先URL1";
96
-
97
- label1.Refresh();
98
-
99
- string testurl = "接続URL";
100
-
101
- webBrowser1.Navigate(testurl);
102
-
103
- }
104
-
105
- string URL_ST = "検索したいURL1";
106
-
107
- string URL_TH = "検索したいURL2";
108
-
109
- string URL_NE = "検索したいURL3";
110
-
111
- string URL_SE = "検索したいURL4";
112
-
113
- private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
114
-
115
- {
116
-
117
- try
118
-
119
- {
120
-
121
- if (e.Url.ToString() == URL_ST)
122
-
123
- {
124
-
125
- //label1の表示変更
126
-
127
- label1.Text = "ログイン処理";
128
-
129
- label1.Refresh();
130
-
131
-
132
-
133
- //1番目フレーム内のNameを取得
134
-
135
- HtmlWindow iframe = webBrowser1.Document.Window.Frames[0];
136
-
137
- HtmlElementCollection elements = iframe.Document.All;
138
-
139
- HtmlElement id = elements.GetElementsByName("userName")[0];
140
-
141
- HtmlElement pw = elements.GetElementsByName("pwd")[0];
142
-
143
-
144
-
145
- //ID・passを入力
146
-
147
- id.InnerText = "admin";
148
-
149
- pw.InnerText = "password";
150
-
151
-
152
-
153
- //Submitボタンをクリック
154
-
155
- HtmlElement login = elements.GetElementsByName("Submit")[0];
156
-
157
- login.InvokeMember("click");
158
-
159
-
160
-
161
-
162
-
163
- }
164
-
165
- else if (e.Url.ToString() == URL_NE)
166
-
167
- {
168
-
169
- webBrowser1.Navigate("接続URL2");
170
-
171
- }
172
-
173
- else if (e.Url.ToString() == URL_TH)
174
-
175
- {
176
-
177
- string filepath = (保存先);
178
-
179
- // クッキーを取得する。
180
-
181
- string cookieStr = webBrowser1.Document.Cookie;
182
-
183
-
184
-
185
- // WebClientを生成する。
186
-
187
- WebClient wc = new WebClient();
188
-
189
- Encoding enc = Encoding.UTF8;
190
-
191
-
192
-
193
- // WebClientのヘッダ設定を行う。
194
-
195
- wc.Headers[HttpRequestHeader.Cookie] = cookieStr;
196
-
197
-
198
-
199
- label1.Text = "ダウンロード中";
200
-
201
- label1.Refresh();
202
-
203
-
204
-
205
- wc.DownloadFile("段ロードURL", filepath);
206
-
207
- wc.Dispose();
208
-
209
-           label1.Text = "ダウンロード完了";
210
-
211
- label1.Refresh();
212
-
213
- }
214
-
215
-
216
-
217
- }
218
-
219
- catch (Exception)
220
-
221
- {
222
-
223
- label1.Text = "例外の発生";
224
-
225
- label1.Refresh();
226
-
227
- }
228
-
229
- }
230
-
231
- }
232
-
233
- }
234
-
235
-
236
6
 
237
7
  ```
238
8
 
9
+ ここに言語を入力
239
10
 
11
+ ```
240
12
 
241
- 追記
13
+ ここに言語を入力
242
14
 
243
- ### 追記
15
+ ```
244
16
 
245
- 上記に変更したとろ、ダウンロードは出来るようなりました。
17
+ 言語を入力
246
18
 
19
+ ```
20
+
247
- のソースで記述的おかしい・こうしたほうが良いなどありましたらアドバイスお願いします。
21
+ 言語を入力
22
+
23
+ ```
24
+
25
+ ここに言語を入力
26
+
27
+ ```
28
+
29
+ ここに言語を入力
30
+
31
+ ```
32
+
33
+ コード
34
+
35
+ ```

3

変更

2018/11/28 06:51

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -100,10 +100,6 @@
100
100
 
101
101
  webBrowser1.Navigate(testurl);
102
102
 
103
- label1.Text = "接続先URL1接続完了";
104
-
105
- label1.Refresh();
106
-
107
103
  }
108
104
 
109
105
  string URL_ST = "検索したいURL1";

2

質問文の変更

2018/11/28 06:45

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -52,10 +52,18 @@
52
52
 
53
53
  using System.Linq;
54
54
 
55
+ using System.Net;
56
+
57
+ using System.Net.Security;
58
+
55
59
  using System.Runtime.InteropServices;
56
60
 
61
+ using System.Security.Cryptography.X509Certificates;
62
+
57
63
  using System.Text;
58
64
 
65
+ using System.Threading;
66
+
59
67
  using System.Threading.Tasks;
60
68
 
61
69
  using System.Windows.Forms;
@@ -70,8 +78,6 @@
70
78
 
71
79
  {
72
80
 
73
-
74
-
75
81
  public Form1()
76
82
 
77
83
  {
@@ -90,7 +96,9 @@
90
96
 
91
97
  label1.Refresh();
92
98
 
99
+ string testurl = "接続URL";
100
+
93
- webBrowser1.Navigate(接続先URL1);
101
+ webBrowser1.Navigate(testurl);
94
102
 
95
103
  label1.Text = "接続先URL1接続完了";
96
104
 
@@ -98,54 +106,146 @@
98
106
 
99
107
  }
100
108
 
101
-
109
+ string URL_ST = "検索したいURL1";
110
+
111
+ string URL_TH = "検索したいURL2";
112
+
113
+ string URL_NE = "検索したいURL3";
114
+
115
+ string URL_SE = "検索したいURL4";
102
116
 
103
117
  private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
104
118
 
105
119
  {
106
120
 
107
- if (label1.Text == "接続先URL1")
121
+ try
108
122
 
109
123
  {
110
124
 
125
+ if (e.Url.ToString() == URL_ST)
126
+
127
+ {
128
+
129
+ //label1の表示変更
130
+
131
+ label1.Text = "ログイン処理";
132
+
133
+ label1.Refresh();
134
+
135
+
136
+
137
+ //1番目フレーム内のNameを取得
138
+
139
+ HtmlWindow iframe = webBrowser1.Document.Window.Frames[0];
140
+
141
+ HtmlElementCollection elements = iframe.Document.All;
142
+
143
+ HtmlElement id = elements.GetElementsByName("userName")[0];
144
+
145
+ HtmlElement pw = elements.GetElementsByName("pwd")[0];
146
+
147
+
148
+
149
+ //ID・passを入力
150
+
151
+ id.InnerText = "admin";
152
+
153
+ pw.InnerText = "password";
154
+
155
+
156
+
157
+ //Submitボタンをクリック
158
+
159
+ HtmlElement login = elements.GetElementsByName("Submit")[0];
160
+
161
+ login.InvokeMember("click");
162
+
163
+
164
+
165
+
166
+
167
+ }
168
+
169
+ else if (e.Url.ToString() == URL_NE)
170
+
171
+ {
172
+
173
+ webBrowser1.Navigate("接続URL2");
174
+
175
+ }
176
+
177
+ else if (e.Url.ToString() == URL_TH)
178
+
179
+ {
180
+
181
+ string filepath = (保存先);
182
+
183
+ // クッキーを取得する。
184
+
185
+ string cookieStr = webBrowser1.Document.Cookie;
186
+
187
+
188
+
189
+ // WebClientを生成する。
190
+
191
+ WebClient wc = new WebClient();
192
+
193
+ Encoding enc = Encoding.UTF8;
194
+
195
+
196
+
197
+ // WebClientのヘッダ設定を行う。
198
+
199
+ wc.Headers[HttpRequestHeader.Cookie] = cookieStr;
200
+
201
+
202
+
203
+ label1.Text = "ダウンロード中";
204
+
205
+ label1.Refresh();
206
+
207
+
208
+
209
+ wc.DownloadFile("段ロードURL", filepath);
210
+
211
+ wc.Dispose();
212
+
213
+           label1.Text = "ダウンロード完了";
214
+
215
+ label1.Refresh();
216
+
217
+ }
218
+
111
219
 
112
220
 
113
221
  }
114
222
 
115
- else if (label1.Text == "接続先URL1接続完了")
223
+ catch (Exception)
116
224
 
117
225
  {
118
226
 
119
- //1番目フレーム内のNameを取得
120
-
121
- HtmlWindow iframe = webBrowser1.Document.Window.Frames[0];
122
-
123
- HtmlElementCollection elements = iframe.Document.All;
124
-
125
- HtmlElement id = elements.GetElementsByName("userName")[0];
126
-
127
- HtmlElement pw = elements.GetElementsByName("pwd")[0];
128
-
129
- //ID・passを入力
130
-
131
- id.InnerText = "admin";
227
+ label1.Text = "例外の発生";
132
-
133
- pw.InnerText = "password";
228
+
134
-
135
- //Submitボタンをクリック
136
-
137
- HtmlElement login = elements.GetElementsByName("Submit")[0];
138
-
139
- login.InvokeMember("click");
229
+ label1.Refresh();
140
230
 
141
231
  }
142
232
 
143
233
  }
144
234
 
145
- }
235
+ }
146
236
 
147
237
  }
148
238
 
149
239
 
150
240
 
151
241
  ```
242
+
243
+
244
+
245
+ 追記
246
+
247
+ ### 追記
248
+
249
+ 上記に変更したところ、ダウンロードは出来るようになりました。
250
+
251
+ このソースで記述的におかしい・こうしたほうが良いなどありましたらアドバイスお願いします。

1

質問の大幅な変更

2018/11/28 06:44

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -1,37 +1,151 @@
1
1
  初心者的質問で申し訳ございませんが、回答していただければ幸いです。
2
2
 
3
+ https://teratail.com/questions/160352
4
+
3
- DocumentCompletedをURL3が開き終わったタイミングでのみ発動させるにはどのように記述すればいいのでょうか
5
+ 上記の質問で無限ループ処理はよくないと回答をいただき、一般的にはDocumentCompletedを利用すればことを知りま
4
6
 
5
7
 
6
8
 
7
- if文URL3場合み特定の動作させるといった方法か思いついていないのですが、
9
+ そこ下記ようなDocumentCompletedを利用したものを記述していのですが、
8
10
 
9
- 他に効率の良い方法などありまたらご教授お願
11
+ 思った動作をいません
10
12
 
11
13
 
12
14
 
13
- ```C#
15
+ 理想動作は、
14
16
 
17
+ 接続先URL1にアクセス→接続先URL1が表示が完了してから
18
+
15
- webBrowser1.Navigate("URL1")
19
+ else if (label1.Text == "接続先URL1接続完了")
20
+
21
+ の部分を実行させたいです。
16
22
 
17
23
 
18
24
 
19
- //ページの読み込み完了待つ
25
+ しかし、完了していない状態のところ動き、
26
+
27
+ HtmlElement id = elements.GetElementsByName("userName")[0];の部分で下記エラー発生しています。
28
+
29
+ System.ArgumentOutOfRangeException: ''0' の値は 'index' に対して有効ではありません。'index' は 0 と -1 の間でなければなりません。
30
+
31
+ パラメーター名:index'
20
32
 
21
33
 
22
34
 
23
- //開き終わったら次のページ2移動
35
+ ページによっては複数回DocumentCompletedが発生するものがあると聞きましたが、
24
36
 
37
+ その場合の記述例を教えていただけないでしょうか。
38
+
39
+ また、その他良い記述方法等ございましたらアドバイスお願いいたします。
40
+
41
+ ```C#
42
+
43
+ using System;
44
+
45
+ using System.Collections.Generic;
46
+
47
+ using System.ComponentModel;
48
+
49
+ using System.Data;
50
+
51
+ using System.Drawing;
52
+
53
+ using System.Linq;
54
+
25
- webBrowser1.Navigate("URL2")
55
+ using System.Runtime.InteropServices;
56
+
57
+ using System.Text;
58
+
59
+ using System.Threading.Tasks;
60
+
61
+ using System.Windows.Forms;
26
62
 
27
63
 
28
64
 
29
- //ページの読み込み完了まで待つ
65
+ namespace WindowsFormsApp8
66
+
67
+ {
68
+
69
+ public partial class Form1 : Form
70
+
71
+ {
72
+
73
+
74
+
75
+ public Form1()
76
+
77
+ {
78
+
79
+ InitializeComponent();
80
+
81
+ }
30
82
 
31
83
 
32
84
 
33
- //開き終わったら次のページ3に移動
85
+ private void button1_Click(object sender, EventArgs e)
34
86
 
87
+ {
88
+
89
+ label1.Text = "接続先URL1";
90
+
91
+ label1.Refresh();
92
+
35
- webBrowser1.Navigate("URL3")
93
+ webBrowser1.Navigate(接続先URL1);
94
+
95
+ label1.Text = "接続先URL1接続完了";
96
+
97
+ label1.Refresh();
98
+
99
+ }
100
+
101
+
102
+
103
+ private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
104
+
105
+ {
106
+
107
+ if (label1.Text == "接続先URL1")
108
+
109
+ {
110
+
111
+
112
+
113
+ }
114
+
115
+ else if (label1.Text == "接続先URL1接続完了")
116
+
117
+ {
118
+
119
+ //1番目フレーム内のNameを取得
120
+
121
+ HtmlWindow iframe = webBrowser1.Document.Window.Frames[0];
122
+
123
+ HtmlElementCollection elements = iframe.Document.All;
124
+
125
+ HtmlElement id = elements.GetElementsByName("userName")[0];
126
+
127
+ HtmlElement pw = elements.GetElementsByName("pwd")[0];
128
+
129
+ //ID・passを入力
130
+
131
+ id.InnerText = "admin";
132
+
133
+ pw.InnerText = "password";
134
+
135
+ //Submitボタンをクリック
136
+
137
+ HtmlElement login = elements.GetElementsByName("Submit")[0];
138
+
139
+ login.InvokeMember("click");
140
+
141
+ }
142
+
143
+ }
144
+
145
+ }
146
+
147
+ }
148
+
149
+
36
150
 
37
151
  ```