web-dev-qa-db-ja.com

Selenium Webdriverはどのようにファイルをブラウザにアップロードしますか?

私はjavascript/Java開発者であり、Selenium 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 まだできません彼らがこれを行う場所を見つけるために。

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

35
justspamjustin

いい質問バディ...彼らはJavascriptのセキュリティ制限を解決するためにHTTPプロキシを書いた。このプロキシを使用すると、「同じホストオリジン」ポリシーの多くの制約を回避できます。このポリシーでは、現在のページが提供されているサーバー以外への呼び出しをブラウザがJavascriptに許可しません。

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

上記のコンテンツのほとんどは、以下から参照されています。Selenium内部の詳細については、以下の参照をお読みください。

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

18
Anuragh27crony

Windownsファイルのアップロード関数のHTMLコードは次のとおりです。

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

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

次のコードを使用して、Windowsファイルのアップロードを完了できます。正常に機能し、コードにはアップロードアクションのクリックは含まれません。

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

Selenium WebdriverとAutoItを使用してFacebookにアップロードした写真があります

手順は以下のとおりです

ステップ1

Eclipseコードでは、Upto(Upload a Photo)は以下のとおりです。

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:写真が正常にアップロードされます。

2
  //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
Ankit jain