web-dev-qa-db-ja.com

Selenium WebDriverを使用してWindowsファイルのアップロードを処理する方法

Stack OverflowでのSelenium WebDriverを使用したファイルのアップロードに関する多くの質問と解決策を見てきました。ただし、次のシナリオでは機能しません。

誰かが次のような解決策を与えました

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

しかし、まだウィンドウハンドルが見つかりません。どうすればそれに取り組むことができますか?

Screenshot

上記のシナリオのソリューションを探しています。

次のWebサイトでこれを確認してください。

http://www.uploadify.com/demos/
http://www.zamzar.com/
37
Jasmine.Olivra
_// assuming driver is a healthy WebDriver instance
WebElement fileInput = driver.findElement(By.name("uploadfile"));
fileInput.sendKeys("C:/path/to/file.jpg");
_

ねえ、それはどこかから私のものです:)。


Zamzarウェブの場合、完全に動作するはずです。あなたは要素をクリックしません。パスを入力するだけです。具体的には、これで問題ありません。

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

UploadifyWebの場合、アップロードするものはinputではなくFlashオブジェクトなので、ピクルスにいます。ブラウザダイアログ(またはFlashオブジェクト)を操作できるようにするWebDriver用のAPIはありません。

そのため、Flash要素をクリックすると、ウィンドウがポップアップ表示され、制御できなくなります。私が知っているブラウザとオペレーティングシステムでは、ウィンドウが開かれた後、カーソルは_File name_入力にあるとほぼ仮定できます。あなたの場合もこの仮定が正しいことを確認してください。

そうでない場合は、を押してそれにジャンプしようとすることができます Alt + N、少なくともWindowsでは...

はいの場合、 Robot クラスを使用して、パスを「ブラインドで」入力できます。あなたの場合、それは次のようなものです:

_driver.findElement(By.id("SWFUpload_0")).click();
Robot r = new Robot();
r.keyPress(KeyEvent.VK_C);        // C
r.keyRelease(KeyEvent.VK_C);
r.keyPress(KeyEvent.VK_COLON);    // : (colon)
r.keyRelease(KeyEvent.VK_COLON);
r.keyPress(KeyEvent.VK_SLASH);    // / (slash)
r.keyRelease(KeyEvent.VK_SLASH);
// etc. for the whole file path

r.keyPress(KeyEvent.VK_ENTER);    // confirm by pressing Enter in the end
r.keyRelease(KeyEvent.VK_ENTER);
_

それは吸うが、それは動作するはずです。これらが必要になる可能性があることに注意してください: ロボットに `:`を入力させるにはどうすればよいですか? および 文字列をKeyEventsに変換する (さらに新しい光沢のある KeyEvent#getExtendedKeyCodeForChar() これは同様の作業を行いますが、JDK7からのみ利用可能です。


Flashの場合、( この説明 から)私が知っている唯一の選択肢は、ダークテクニックを使用することです

まず、Flashアプリケーションのソースコードを変更し、ActionScriptのExternalInterface APIを使用して内部メソッドを公開します。一度公開されると、これらのメソッドはブラウザーのJavaScriptから呼び出し可能になります。

次に、JavaScriptがFlashアプリの内部メソッドを呼び出すことができるようになったので、WebDriverを使用してWebページでJavaScript呼び出しを行い、それからFlashアプリを呼び出します。

この手法は、flash-Seleniumプロジェクトのドキュメントでさらに説明されています。 ( http://code.google.com/p/flash-Selenium/ )しかし、この手法の背後にある考え方はWebDriverにも当てはまります。

43
Petr Janeček

以下のコードは私のために働く:

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"));
10

C#およびSeleniumを使用すると、このコードはここで機能します。[〜#〜] note [〜#〜]パラメーターを使用して「localhost」をスワップアウトします。特定のサーバーがlocalhostではない場合はFindWindowを呼び出し、複数のダイアログがぶら下がっている場合は最新のダイアログを開きますが、これで開始できます。

    using System.Threading;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    using OpenQA.Selenium;

    [DllImport("user32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool SetForegroundWindow(IntPtr hWnd);

    [DllImport("user32.dll", EntryPoint = "FindWindow")]
    public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    public static void UploadFile(this IWebDriver webDriver, string fileName)
    {
        webDriver.FindElement(By.Id("SWFUpload_0")).Click();
        var dialogHWnd = FindWindow(null, "Select file(s) to upload by localhost");
        var setFocus = SetForegroundWindow(dialogHWnd);
        if (setFocus)
        {
            Thread.Sleep(500);
            SendKeys.SendWait(fileName);
            SendKeys.SendWait("{ENTER}");
        }
    }
3
Matt

Vbsscriptファイルを使用して、シェルスクリプトでsendkeysを使用しました。以下はvbsファイルのコードです。

Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.SendKeys "C:\Demo.txt"
WshShell.SendKeys "{ENTER}"

以下は、このvbsファイルを実行するためのSeleniumコード行です。

driver.findElement(By.id("uploadname1")).click();
Thread.sleep(1000);
Runtime.getRuntime().exec( "wscript C:/script.vbs" );
2
Vignesh Sunder

要素を検索し(type = "file"属性を持つ入力要素である必要があります)、ファイルへのパスを送信します。

WebElement fileInput = driver.findElement(By.id("uploadFile"));
fileInput.sendKeys("/path/to/file.jpg");

注:RemoteWebDriverを使用している場合は、ファイル検出機能も設定する必要があります。デフォルトはUselessFileDetectorです

WebElement fileInput = driver.findElement(By.id("uploadFile"));
driver.setFileDetector(new LocalFileDetector());
fileInput.sendKeys("/path/to/file.jpg");
1
Marissa Novak

System.Windows.Formsバイナリをテストソリューションにインポートし、UIの[アップロード]ボタンをクリックして次の2つのLOCを呼び出します。

        // Send the file path and enter file path and wait.
        System.Windows.Forms.SendKeys.SendWait("complete path of the file");
        System.Windows.Forms.SendKeys.SendWait("{ENTER}");
1
Sham

これを解決するより簡単な方法があります。英語のキーボードを使用している場合、彼のソリューションは機能します。そうでない場合は、特殊文字のキーを「マップ」するのに苦労します。

の代わりに robot.keyPressおよびrobot.keyReleaseToolkit を使用して、文字列をクリップボードにコピーして貼り付けることができるすべてのキー。

    StringSelection s = new StringSelection("Path to the file");
    Toolkit.getDefaultToolkit().getSystemClipboard().setContents(s, null);
    Robot robot = new Robot();
    robot.keyPress(Java.awt.event.KeyEvent.VK_ENTER);
    robot.keyRelease(Java.awt.event.KeyEvent.VK_ENTER);
    robot.keyPress(Java.awt.event.KeyEvent.VK_CONTROL);
    robot.keyPress(Java.awt.event.KeyEvent.VK_V);
    robot.keyRelease(Java.awt.event.KeyEvent.VK_CONTROL);
    Thread.sleep(3000);
    robot.keyPress(Java.awt.event.KeyEvent.VK_ENTER);
1
Bruno Pontes

以下のコードは私のために働く:

// wait for the window to appear
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.alertIsPresent());

// switch to the file upload window
Alert alert = driver.switchTo().alert();

// enter the filename
alert.sendKeys(fileName);

// hit enter
Robot r = new Robot();
r.keyPress(KeyEvent.VK_ENTER);
r.keyRelease(KeyEvent.VK_ENTER);

// switch back
driver.switchTo().activeElement();
1
Rahul Kaup

この例を実現するために、絶対パス全体に二重スラッシュ\\を付けました:-D:\\ images \\ Lighthouse.jpg

手順-参照オプションを持つボタンにsendkeysを使用する(ウィンドウボックスを開いてファイルを選択するボタン)-ファイルをアップロードするボタンをクリックします。

driver.findElement(By.xpath("//input[@id='files']")).sendKeys("D:\\images\\Lighthouse.jpg");  
Thread.sleep(5000);
driver.findElement(By.xpath("//button[@id='Upload']")).click();
0
Shubham Jain

AutoItスクリプトを使用して、Selenium Webdriverでファイルのアップロードを処理します。上記のシナリオでは正常に機能しています。

Runtime.getRuntime().exec("E:\\AutoIT\\FileUpload.exe");

詳細については、以下のリンクを使用してください: http://www.guru99.com/use-autoit-Selenium.html

0
Anumanth
        webDriver.FindElement(By.CssSelector("--cssSelector--")).Click();
        webDriver.SwitchTo().ActiveElement().SendKeys(fileName);

私にとってはうまくいきました。上記の回答でC#.netのMattが提供した別のアプローチをとることも、アップロードボックスのクラス名#32770で機能します。

0
user6723403

まず、プロジェクトリソースディレクトリにファイルを追加します

それから

public YourPage uploadFileBtnSendKeys() {
    final ClassLoader classLoader = getClass().getClassLoader();
    final File file = new File(classLoader.getResource("yourFile.whatever").getPath());
    uploadFileBtn.sendKeys(file.getPath());
    return this;
}

ワラ、選択したファイルが表示され、ファイルエクスプローラーウィンドウがスキップされます。

0
rogger2016

別の解決策は、「ファイルを開く」ダイアログを自動化するスクリプトを作成することです。 AutoIt を参照してください。

また、要素を「クリック」できない場合、私の回避策は一般的にこれを行うことです:

element.SendKeys(Keys.Enter);

これがお役に立てば幸いです(古い記事ですが)

0
sparkyShorts