57

StackOverflowでSeleniumWebDriverを使用したファイルのアップロードに関する質問や解決策をたくさん見てきました。しかし、それらのどれも次のシナリオのために働いていません。

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

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

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

スクリーンショット

上記のシナリオの解決策を探しています。

以下のウェブサイトのいずれかでこれを確認してください。

http://www.uploadify.com/demos/
http://www.zamzar.com/
4

15 に答える 15

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

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


Zamzar Webの場合、完全に機能するはずです。要素をクリックしません。パスを入力するだけです。具体的には、これで問題ありません。

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

Uploadify Webの場合、アップロードは noinputであり、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);

それは悪いですが、うまくいくはずです。これらが必要になるかもしれないことに注意してください: How can I make Robot type a `:`? および文字列を 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 にも当てはまります。

于 2012-06-29T08:13:22.487 に答える
5

C# と Seleniumを使用すると、ここでこのコードが機能します。特定のサーバーの FindWindow 呼び出しでパラメーターを使用して「localhost」を交換する必要があることに注意してください。ぶらぶらしているダイアログは1つではありませんが、これで始められるはずです:

    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}");
        }
    }
于 2015-11-04T16:14:16.117 に答える
2

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

すべてのキーの代わりに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);
于 2016-12-22T18:46:11.913 に答える
0

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

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

element.SendKeys(Keys.Enter);

これが役に立てば幸いです(古い投稿ですが)

于 2014-06-24T17:22:10.020 に答える
0

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}");
于 2012-11-08T04:24:02.133 に答える
0

以下のコードは私のために働きます:

// 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();
于 2015-05-27T14:08:29.343 に答える
-1

以下のものは私のために働いていました

webDriver.findElement(By.xpath("//input[@type='file' and @name='importFile']")).sendKeys("C:/path/to/file.jpg");
于 2016-06-23T11:27:57.733 に答える