回答編集履歴

4

検証に使ったコードを追記

2016/09/26 03:45

投稿

退会済みユーザー
test CHANGED
@@ -121,3 +121,191 @@
121
121
  InvokeMember("Click") のあと、制御がまたこのハンドラに戻ってくるかがキモなのですが、うまく動かなかったらデバッガでそのあたりがどうなっているか調べて連絡ください。
122
122
 
123
123
 
124
+
125
+ 【検証に使ったコードを追記】
126
+
127
+
128
+
129
+ 検証に使ったコードを以下にアップしておきます。既存のコードを流用したので、手動で http://honyaku.yahoo.co.jp/transtext/ へのナビゲーションを開始するところがちょっと違いますが、基本は質問者さんがコードで示したやりたいことの通りのはずです。
130
+
131
+
132
+
133
+ 実行結果は以下の画像の通りです。
134
+
135
+
136
+
137
+ http://surferonwww.info/BlogEngine/image.axd?picture=2016%2f9%2ftranstext.jpg
138
+
139
+
140
+
141
+ 一応このサンプルでは期待通りの結果になりましたが、原文に入力している時に原文が何語かの判定を行うためサーバーとのやり取りをしているようで、プログラムで原文をセットして即送信では、場合によってはそのあたりがうまくいかないかもしれません。
142
+
143
+
144
+
145
+ 対症療法的なことのカタマリのようなもので、Yahoo! は予告無しに html 要素の id、呼び出し先 url、その他いろいろ変えるでしょうから、明日は動かないかもしれません。
146
+
147
+
148
+
149
+ というわけで、最初のスレッドで htsign さんが書かれたように、自分もお勧めはできません。脅かすわけではないですが、クローラを作って図書館のサイトにアクセスしたら業務妨害で逮捕されたという例もあるようですし。
150
+
151
+
152
+
153
+
154
+
155
+ ```
156
+
157
+ using System;
158
+
159
+ using System.Collections.Generic;
160
+
161
+ using System.ComponentModel;
162
+
163
+ using System.Data;
164
+
165
+ using System.Drawing;
166
+
167
+ using System.Linq;
168
+
169
+ using System.Text;
170
+
171
+ using System.Windows.Forms;
172
+
173
+
174
+
175
+ namespace WebBrowser
176
+
177
+ {
178
+
179
+ public partial class Form1 : Form
180
+
181
+ {
182
+
183
+ // 2016/9/26 teratail の検証用
184
+
185
+ // https://teratail.com/questions/49159
186
+
187
+ private string url = "http://honyaku.yahoo.co.jp/transtext/";
188
+
189
+ List<string> _ant = new List<string>() { "日本語に翻訳",
190
+
191
+ "英語に翻訳",
192
+
193
+ "中国語に翻訳",
194
+
195
+ "ドイツ語に翻訳" };
196
+
197
+ List<string> translated = new List<string>();
198
+
199
+ int count = 0;
200
+
201
+
202
+
203
+ public Form1()
204
+
205
+ {
206
+
207
+ InitializeComponent();
208
+
209
+ textBox1.Text = url;
210
+
211
+
212
+
213
+ webBrowser1.ScriptErrorsSuppressed = true;
214
+
215
+ }
216
+
217
+
218
+
219
+ private void navigateButton_Click(object sender, EventArgs e)
220
+
221
+ {
222
+
223
+ webBrowser1.Navigate(textBox1.Text);
224
+
225
+ }
226
+
227
+
228
+
229
+ private void webBrowser1_DocumentCompleted(object sender,
230
+
231
+ WebBrowserDocumentCompletedEventArgs e)
232
+
233
+ {
234
+
235
+ // 初期画面
236
+
237
+ if (e.Url.ToString() == url)
238
+
239
+ {
240
+
241
+ if (count < _ant.Count)
242
+
243
+ {
244
+
245
+ // 最初の原文をセットして送信
246
+
247
+ webBrowser1.Document.GetElementById("textText").InnerText = _ant[count];
248
+
249
+ webBrowser1.Document.GetElementById("btn").InvokeMember("Click");
250
+
251
+ }
252
+
253
+ }
254
+
255
+
256
+
257
+ // 翻訳が返ってきたときの処理
258
+
259
+ if (e.Url.ToString().Contains("http://honyaku.yahoo.co.jp/darla/php/fc.php"))
260
+
261
+ {
262
+
263
+ count++;
264
+
265
+ translated.Add(webBrowser1.Document.GetElementById("trn_textText").InnerText);
266
+
267
+
268
+
269
+ // 次の原文をセットして送信
270
+
271
+ if (count < _ant.Count)
272
+
273
+ {
274
+
275
+ webBrowser1.Document.GetElementById("textText").InnerText = _ant[count];
276
+
277
+ webBrowser1.Document.GetElementById("btn").InvokeMember("Click");
278
+
279
+ }
280
+
281
+
282
+
283
+ if (count == _ant.Count)
284
+
285
+ {
286
+
287
+ string result = "";
288
+
289
+
290
+
291
+ foreach (string s in translated)
292
+
293
+ {
294
+
295
+ result += s + "\n";
296
+
297
+ }
298
+
299
+ MessageBox.Show(result);
300
+
301
+ }
302
+
303
+ }
304
+
305
+ }
306
+
307
+ }
308
+
309
+ }
310
+
311
+ ```

3

サンプルコード追記

2016/09/26 03:45

投稿

退会済みユーザー
test CHANGED
@@ -27,3 +27,97 @@
27
27
 
28
28
 
29
29
  お試しください。
30
+
31
+
32
+
33
+ 【サンプルコード追記】
34
+
35
+
36
+
37
+ 最初のスレッドにあった以下の質問者さんの DocumentCompleted イベントハンドラコードを、
38
+
39
+
40
+
41
+ ```
42
+
43
+ private void webBrowser1_DocumentCompleted(object sender,
44
+
45
+ WebBrowserDocumentCompletedEventArgs e)
46
+
47
+ {
48
+
49
+ if (ur == e.Url.ToString())
50
+
51
+ {
52
+
53
+ foreach (string htm in _ant)
54
+
55
+ {
56
+
57
+ webBrowser1.Document.GetElementById("textText").InnerText = htm;
58
+
59
+ webBrowser1.Document.GetElementById("btn").InvokeMember("Click");
60
+
61
+ btn_click();
62
+
63
+ }
64
+
65
+ test();
66
+
67
+ }
68
+
69
+ }
70
+
71
+ ```
72
+
73
+
74
+
75
+ を以下のようにしてみたらいかがでしょう? 頭の中で考えて書いただけで検証はしてないので、質問者さんの方でデバッガ等を使って期待通りの動きになるか十分検証してください。
76
+
77
+
78
+
79
+ ```
80
+
81
+ int n = 0;
82
+
83
+
84
+
85
+ private void webBrowser1_DocumentCompleted(object sender,
86
+
87
+ WebBrowserDocumentCompletedEventArgs e)
88
+
89
+ {
90
+
91
+ if (ur == e.Url.ToString())
92
+
93
+ {
94
+
95
+ if (n < _ant.Count)
96
+
97
+ {
98
+
99
+ string htm = _ant[n];
100
+
101
+ webBrowser1.Document.GetElementById("textText").InnerText = htm;
102
+
103
+ webBrowser1.Document.GetElementById("btn").InvokeMember("Click");
104
+
105
+ btn_click();
106
+
107
+ n++;
108
+
109
+ }
110
+
111
+ test();
112
+
113
+ }
114
+
115
+ }
116
+
117
+ ```
118
+
119
+
120
+
121
+ InvokeMember("Click") のあと、制御がまたこのハンドラに戻ってくるかがキモなのですが、うまく動かなかったらデバッガでそのあたりがどうなっているか調べて連絡ください。
122
+
123
+

2

依然として分かりにくかったので再度訂正

2016/09/25 07:05

投稿

退会済みユーザー
test CHANGED
@@ -22,7 +22,7 @@
22
22
 
23
23
 
24
24
 
25
- なので、WebBrowser.DocumentCompleted イベントハンドラの中で foreach で回すのはやめて、[翻訳]ボタンクリックで最初にイベントが発生したときに「てすと1」を送信 ⇒ その応答が返ってきて次のイベントが発生した時「テスト2」を送信 ⇒ に「test三」⇒ 次に「test四」とすればよさそうです。
25
+ なので、WebBrowser.DocumentCompleted イベントハンドラの中で foreach で回すのはやめて、[翻訳]ボタンクリックで「てすと1」を送信 ⇒ その応答が返ってきて DocumentCompleted イベントが発生した時「テスト2」を送信 ⇒ 同様に「test三」「test四」を繰り返す・・・とすればよさそうです。
26
26
 
27
27
 
28
28
 

1

分かりやすくするため追加

2016/09/25 06:24

投稿

退会済みユーザー
test CHANGED
@@ -22,7 +22,7 @@
22
22
 
23
23
 
24
24
 
25
- なので、WebBrowser.DocumentCompleted イベントハンドラの中で foreach で回すのはやめて、最初にイベントが発生したときに「てすと1」を送信 ⇒ その応答が返ってきて次のイベントが発生した時「テスト2」を送信 ⇒ 次に「test三」⇒ 次に「test四」とすればよさそうです。
25
+ なので、WebBrowser.DocumentCompleted イベントハンドラの中で foreach で回すのはやめて、[翻訳]ボタンクリックで最初にイベントが発生したときに「てすと1」を送信 ⇒ その応答が返ってきて次のイベントが発生した時「テスト2」を送信 ⇒ 次に「test三」⇒ 次に「test四」とすればよさそうです。
26
26
 
27
27
 
28
28