4

IE を開き、Web サイトに移動し、ログインして、いくつかのファイルをアップロードする必要がある ac# Windows アプリ プロジェクトがあります。

これを行うには、shDocvW と mshtml ライブラリを使用しました。IE を開き、Web サイトに移動してログインできますが、ファイルをアップロードできません。

私はウェブサイトに移動し、ウェブサイトの入力フィールド(これは「テキスト」タイプの入力フィールドです)にテキスト値を追加することができます -

HTMLInputElement txtbox1 =(HTMLInputElement)oDoc.all.item("login", 0);
txtbox1.value = "Login_name";

同様に、「パスワード」タイプの入力フィールドにテキスト値を追加することもできました。ウェブサイトにログインしたら、ファイルをアップロードする必要があります。

私が直面している問題は、「ファイル」タイプの入力フィールドにパス (文字列) を追加できないことです。

解決策が見つかりません。

4

2 に答える 2

4

これを行うために多くの方法を試しましたが、IE8 がセキュリティ上の理由から Value プロパティを読み取り専用にしたため、それは不可能でした。

さて、私は回避策を見つけました。これは非常に単純ですが、 の使用がSendKeys常に最適なプログラミング ソリューションと見なされるとは限りません。しかし、それは仕事をします。

oBrowser.Navigate("http://www.some-url.com", ref oNull, ref oNull, ref oNull, ref oNull);        

while (oBrowser.Busy)   
{
    System.Threading.Thread.Sleep(20);
}

//Locate the Input element of type="file"
HTMLInputElement file_1 = (HTMLInputElement)oDoc.all.item("file_1", 0);
file_1.select();        

SendKeys.Send("{TAB}");   //Navigate to the Browse button
SendKeys.Send(" ");       //Click on the browse button

SendKeys.Send(@"c:\Test.txt");         //File Path
SendKeys.Send("{TAB}");
SendKeys.Send("{ENTER}");

このコードは、アクティブなウィンドウをチェックし、おそらくすべてのSendKeysコマンドの前に正しいウィンドウを設定することで改善できます。FindWindow()これは、とFindWindowEx()を使用して実行できますuser32.dll。Windows API のこれらのメソッドは、アクティブなウィンドウと子ウィンドウを見つけるために使用されます。

于 2009-12-21T19:43:45.140 に答える
2

実装には IE を使用する必要がありますか? これは、クラスを使用して POST リクエストを使用してファイルをアップロードする方が簡単かもしれませんWebClientが、これはフォームがアップロードで他の投稿アクションを提供するかどうかによって異なります。そうでない場合は、使用できますWebClient.UploadFile

このフォームに複数の POST 値をアップロードする必要がある場合 (つまり、新しいファイル名?)、ここを見てください: WebClient.UploadFile と WebClient.UploadValues を同じ呼び出しで

于 2009-12-09T09:44:38.410 に答える