web-dev-qa-db-ja.com

SeleniumまたはWebdriverを使用してテスト自動化でファイルのアップロードを処理する方法

テストの自動化にWebdriverを使用するすべての人は、Web開発におけるその大きな利点を認識している必要があると思います。

しかし、ファイルのアップロードがWebflowの一部である場合、大きな問題があります。テストの自動化をやめます。ブラウザーのセキュリティ制限(ファイル選択の呼び出し)により、テストを自動化することは事実上不可能になります。

Afaikの唯一のオプションは、Webドライバーがファイルのアップロードボタンをクリックしてスレッドをスリープ状態にし、開発者/テスターに​​ファイルを手動で選択させて、残りのWebフローを実行することです。

これに対処する方法はありますか?それは本当にこのように行うことができないからです。それは意味がありません。

これは、ブラウザのセキュリティ制限が適用されないときに知っている唯一のケースです。

<script language=javascript>   
  function window.onload(){   
          document.all.attachment.focus();   
          var WshShell=new ActiveXObject("WScript.Shell")   
          WshShell.sendKeys("D:\MyFile.doc")
  }   
</script>
23
lisak

Webdriverは、IEおよびFirefoxでこれを非常に簡単に処理できます。要素を見つけてそこに入力するという単純なケースです。

driver = webdriver.Firefox()
element = driver.find_element_by_id("fileUpload")
element.send_keys("myfile.txt")

上記の例はPython=にありますが、あなたはアイデアを得ます

40
AutomatedTester

AWTロボットの使用は、Javaを使用している場合の1つのオプションです。しかし、これは良いオプションではなく、信頼性が低く、まったくクリーンではありません。 こちらをご覧ください

私はHttpClientを使用して、Seleniumの外部でいくつかのテストを実行します。それはより信頼性が高く、よりクリーンです。

以下のコードを参照してください。あなたの仕事に合うようにするには、より多くの例外処理と条件文が必要です。

HttpClient c = new HttpClient();
String url = "http://" + cargoHost + ":" + cargoPort + contextPath + "/j_security_check";
PostMethod post = new PostMethod(url);
post.setParameter("j_username", username);
post.setParameter("j_password", password);
c.executeMethod(post);

url = "http://" + cargoHost + ":" + cargoPort + contextPath + "/myurl.html";
MultipartPostMethod mPost = new MultipartPostMethod(url);
String fileNameWithPath = this.getClass().getClassLoader().getResource(filename).getPath();
File f1 = new File(fileNameWithPath);
mPost.addParameter(elementName, f1);
mPost.addParameter("action", "upload");
mPost.addParameter("ajax", "true");

c.executeMethod(mPost);
mPost.getResponseBodyAsString();
3
rahul

テキストボックスへの入力の提案は、テキストボックスが有効になっている場合にのみ機能します。かなりの数のアプリケーションで、明らかな理由により、ファイルシステムのファイルブラウザーを使用する必要があります。だったらどうしようか? WebDriverの専門家は、KeyBoardバッファーにキーを提示するだけだとは考えていませんでした(これは、以前の自動化の時代には、これまでは「無知」でした)。

===

数日間の少しの睡眠、頭を叩いたり、髪を引っ張ったりした後、私はここ(および他の場所)で提案されているロボットベースのソリューションのいくつかを得ることができました。

私が遭遇した問題は、正しいファイルパスと名前が入力されたダイアログテキストボックスが、次のようにVK_ENTERでファイル名を終了するKeyPress/Releaseイベントに応答できないことでした。

private final static int Enter = KeyEvent.VK_ENTER;
keyboard.keyPress(Enter);
keyboard.keyRelease(Enter);

何が起こるかというと、ファイルパスとファイル名は正しく入力されていますが、ダイアログは開いたままです-キーエミュレーションがそれを終了し、テスト中のアプリによって処理されることを絶えず願っています。

このロボットの動作を少し良くする方法を知っている人はいますか?

1
Bey

ActiveXの使用に関する著者の最初の投稿に参考資料を提供したいと思っていました。もう1つの回避策は、デスクトップGUI自動化ツールと統合して作業を行うことです。たとえば、google "Selenium AutoIt"。よりクロスプラットフォームのソリューションについては、AutoItよりもSikuliのようなツールを検討してください。

もちろん、これはIE&SendKeysを介したFirefoxでのアップロードに対するWebDriverのサポートを考慮していません。また、その方法が機能しない他のブラウザを考慮していません。

1
David

グリッドを使用している場合は、テストファイルのフォルダーを開いて共有できます。

このようにして、アップロード入力フィールドを選択し、その値を\\ pc-name\myTestFilesに設定できます

そうでない場合は、各システムのローカルファイルを使用する必要があります。

0
HerrWalter

この問題に何時間も頭をぶつけた後、Firefox 7.0.1に上記のFirefoxDriver sendKeys()の実装に問題があるように思われることをコミュニティに伝えたかった(少なくとも私はそれを動作させることができなかった)私のWindows 7 x64ボックスで)、回避策は見つかりませんでしたが、Firefox 8.0.1にアップデートすると問題が解決したようです。不思議に思う人のために、Selenium RCを使用してこの問題を解決することもできます(ただし、すべてのターゲットオペレーティングシステムと、ファイル選択ダイアログとの対話に必要なネイティブキープレスを考慮する必要があります)。うまくいけば、私が回避しなければならなかった問題は、要約すると他の人々を少し時間を節約します:

https://Gist.github.com/151136

0
Matthew Madson