33

私はjavascript/javaの開発者です。セレンのwebdriverオートメーションフレームワークがファイルシステムからファイルをアップロードする方法を理解しようとしています。セキュリティ違反であるため、javascriptでファイル入力を設定することは不可能です。しかし、どういうわけかwebdriverは次のコマンドでこれを行うことができます:セレンウェブドライブはどのようにファイルをブラウザにアップロードしますか?

driver.setFileDetector(new LocalFileDetector()); 
WebElement upload = driver.findElement(By.id("myfile")); 
upload.sendKeys("/Users/sso/the/local/path/to/darkbulb.jpg"); 
driver.findElement(By.id("submit")).click(); 

そこで、キーを送信して値を設定していますか?理解できません。私はここで見つけたソースコードを見てきました: http://code.google.com/p/selenium/source/checkout 私はまだ彼らがこれを行う場所を見つけることができません。

編集:私の質問はセレンでこれを行う方法ではありませんが、どのようにセレンの開発者がこれを可能にしましたか?彼らはどのようにしてJavaScriptのセキュリティ制限を回避しましたか?彼らはどのようにファイルをアップロードしていますか?

+0

私の最初の推測では、ボタン要素がそれに「の値」を持っていることである、とのSendKeysは、値に文字を追加しますか? – djangofan

答えて

17

ニース質問相棒を知っている...彼らは、Javascriptのに関するセキュリティ制限を解決するためのHTTPプロキシを書かれています。このプロキシを使用することにより、ブラウザは、現在のページが提供されているサーバ以外のものにブラウザがJavascriptを呼び出すことを許可しない、「同じホスト起点」ポリシーの制約の多くを側立てることができました。

さらにWebDriverは、OSレベルでイベントを発生させる代わりの方法を使用します。これらの「ネイティブイベント」はブラウザによって生成されないため、このアプローチは合成イベントに適用されるセキュリティ制限を迂回し、特定のプラットフォーム上のあるブラウザで動作していれば別のブラウザのコードを再利用すると、簡単です。

上記の内容のほとんどは、below..doセレンの詳細については、以下の参照を読んでから参照されている、あなたはFileオブジェクトを作成する必要があり、特別のJavaでいくつかのケースでは

http://www.aosabook.org/en/selenium.html

+0

下記の私の答えを参照してください。 – djangofan

0
//assuming driver is a healthy WebDriver instance 
    WebElement fileInput = driver.findElement(By.name("uploadfile")); 
    fileInput.sendKeys("C:/path/to/file.jpg"); 

または

driver.findElement(By.id("inputFile")).sendKeys("C:/path/to/file.jpg"); 

これを試してみて、私は

+0

申し訳ありませんが私は私の質問で明確ではなかった。私は質問に明確化を加えました。私はセレンの開発者があなたが可能と説明したことを成し遂げたことがどのようなものかを知りたいと思います。 – justspamjustin

0

を内部と次のようにabsolutePath()をドライバに渡します。

File file = new File(sampleFile); 
driver.findElement(By.id("<Your input tag with type of File>")).sendKeys(file.getAbsolutePath()); 

サンプルファイルは、アップロードが必要なファイルを指す文字列です。 これはFirefoxとChromeで私にとってはうまくいきます。

4

アップロードwindownsファイル機能のHTMLコードは次のとおりです。

<input id="fileField" type="file" onchange="document.getElementById('textfield').value=this.value" name="position"> 

<input type="submit" value="导入"> 

は、Windowsのファイルをアップロード仕上げに次のコードを使用することができます。それは正常に動作し、コードはアップロードアクションのクリックを含まない。私はセレンwebdriverをとのAutoItを使用してのFacebookにアップロード写真

手順は、(写真をアップロード)件まで

日食コードで

ステップ1

以下の通りですいる

driver.FileDetector = new LocalFileDetector(); 
FindElement(By.Id("fileField")).SendKeys(@"C:\Users\admin\Desktop\ProfessionCodes.txt"); FindElement(By.CssSelector("input[type='submit']")).Click(); 
2

されます以下のようになります。

WebElement Upload = Firefox.findElement(By.cssSelector("input[id^='u_']")); 
Upload.click(); 

ステップ2

ダウンロードおよびインストールのAutoIt:http://www.autoitscript.com/site/autoit/downloads/(ダウンロードZIP)

ステップ3

メモ帳に以下のようにコードを記述し、PhotoUpload.au3

WinWaitActive("File Upload") 
Send("D:\Photo0116.jpg") 
Send("{ENTER}") 
として保存

ステップ4 :この.au3ファイルを右クリックして&をコンパイルしてください。

ステップ5:以下のようにスクリプトファイルにコードを追加します。

try { 
    String[] commands = new String[]{}; 
    // Location of the autoit executable 
    commands = new String[] {"D:\\My softwares\\install software\\selenium\\UploadPhoto3.exe"}; 
    Runtime.getRuntime().exec(commands); 
}  
catch (IOException e) {} 

ステップ6:スクリプトの実行(PhotoUpload.java

ステップ7:写真はアップロードに成功します。

+0

あなたはコーディングのためのスクリーンショットとUIを使って言うことができますか? –

0

これは、ファイルのアップロードを行うために私を助け、

コード:

public class FileUpload { 
     @Test 
     public void test() { 
      WebDriver driver = new FirefoxDriver(); 
      driver.get("http://www.freepdfconvert.com/pdf-word"); 
      driver.findElement(By.id("clientUpload")).click(); 
      driver.switchTo() 
        .activeElement() 
        .sendKeys(
          "/home/likewise-open/GLOBAL/123/Documents/filename.txt"); 
      driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS); 
      driver.findElement(By.id("convertButton")); 
      /* 
      * driver.switchTo().activeElement() 
      * .sendKeys("selenium_2_testing_tools.pdf"); ; 
      */ 
     { 
       driver.wait(30000); 
      } catch (Exception er) { 
       System.out.println(er); 
      } 

     } 
    } 
関連する問題