17

Selenium WebDriverとJavaを使用していますが、ファイルのアップロード機能を自動化する必要があります。何度も試しましたが、[参照]ボタンをクリックして新しいウィンドウを開くと、スクリプトの実行が停止し、スタックします。私はFireFoxとIEドライバーの両方で試しましたが、役に立ちませんでした。

autoit exeファイルを呼び出してみましたが、[参照]ボタンをクリックすると新しいウィンドウが開くので、特定のステートメント

Runtime.getRuntime().exec("C:\\Selenium\\ImageUpload_FF.exe")

実行できませんでした。親切に助けて

4

7 に答える 7

23

これは、Firefox、Chrome、および IE ドライバーで動作するはずです。

FirefoxDriver driver = new FirefoxDriver();

driver.get("http://localhost:8080/page");

File file = null;

try {
    file = new File(YourClass.class.getClassLoader().getResource("file.txt").toURI());
} catch (URISyntaxException e) {
    e.printStackTrace();
}

Assert.assertTrue(file.exists()); 

WebElement browseButton = driver.findElement(By.id("myfile"));
browseButton.sendKeys(file.getAbsolutePath());
于 2011-05-25T21:00:49.747 に答える
3

アレックスの答えに何かを追加する必要があると思います。

次のコードを使用して、[開く] ウィンドウを開こうとしました。

driver.findElement(My element).click()

ウィンドウは開きましたが、ドライバーが応答しなくなり、コード内のアクションがロボットのアクションに到達しませんでした。おそらくブラウザがフォーカスを失ったため、これが発生する理由はわかりません。

私がそれを機能させた方法は、Actions selenium クラスを使用することでした。

 Actions builder = new Actions(driver);

 Action myAction = builder.click(driver.findElement(My Element))
       .release()
       .build();

    myAction.perform();

    Robot robot = new Robot();
    robot.keyPress(KeyEvent.VK_CONTROL);
    robot.keyPress(KeyEvent.VK_V);
    robot.keyRelease(KeyEvent.VK_V);
    robot.keyRelease(KeyEvent.VK_CONTROL);
    robot.keyPress(KeyEvent.VK_ENTER);
    robot.keyRelease(KeyEvent.VK_ENTER);
于 2012-07-26T08:51:12.017 に答える
3

ボタンをクリックして、以下のコードを使用します。パス名に「\」ではなく「\\」を使用していることに注意してください。コードが機能することが重要です..

WebElement file_input = driver.findElement(By.id("id_of_button"));
file_input.sendKeys("C:\\Selenium\\ImageUpload_FF.exe");
于 2013-12-01T08:30:42.557 に答える
0

私はセレンWebドライバーとJavaも使用していますが、同じ問題がありました。私がしているのは、クリップボード内のファイルへのパスをコピーし、それを「開いている」ウィンドウに貼り付けて「Enter」をクリックすることです。フォーカスは常に「開く」ボタンにあるため、これは機能しています。

コードは次のとおりです。

これらのクラスとメソッドが必要になります:

import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.awt.Toolkit;
import java.awt.datatransfer.StringSelection;


public static void setClipboardData(String string) {
   StringSelection stringSelection = new StringSelection(string);
   Toolkit.getDefaultToolkit().getSystemClipboard().setContents(stringSelection, null);
}

そして、「開いている」ウィンドウを開いた直後に、それが私がすることです:

setClipboardData("C:\\path to file\\example.jpg");
//native key strokes for CTRL, V and ENTER keys
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_V);
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);

以上です。それは私のために働いています、私はそれがあなたの何人かのために働くことを願っています.

于 2012-02-24T13:48:14.290 に答える
0

モーダル ダイアログが開いた直後にスクリプトが機能せず、ハングするだけです。最初に呼び出しautoit.exeてから、クリックしてモーダル ダイアログを開きます。

こんな感じでうまくいきますが、

 Runtime.getRuntime().exec("Upload_IE.exe");
 selenium.click("//input[@name='filecontent']");
于 2012-07-04T06:42:35.683 に答える
0

クラスを使用RemoteWebElementすると、次のコードを使用してファイルをアップロードできます。

// TEST URL: "https://www.filehosting.org/"
// LOCATOR: "//input[@name='upload_file'][@type='file'][1]"

LocalFileDetector detector = new LocalFileDetector();
File localFile = detector.getLocalFile( filePath );
RemoteWebElement input = (RemoteWebElement) driver.findElement(By.xpath( locator ));
input.setFileDetector(detector);
input.sendKeys(localFile.getAbsolutePath());
input.click();


JavaSelenium: sendKeys()またはRobot Class.

このメソッドは、指定したファイル パスをクリップボードに設定します。

  1. としてクリップボードにデータをコピーします。

public static void setClipboardData(String filePath) {
    StringSelection stringSelection = new StringSelection( filePath );
    Toolkit.getDefaultToolkit().getSystemClipboard().setContents(stringSelection, null);
}

  1. Finder ウィンドウでファイルを見つけ、 を押しOKてファイルを選択します。
    • 勝つ [ Ctrl+ V ]
    • マック
      • " Go To Folder" - Command ⌘ + Shift+ G.
      • 貼り付け - Command ⌘ + V と
      • 押しOKて開きます。

enum Action {
    WIN, MAC, LINUX, SEND_KEYS, FILE_DETECTOR;
}
public static boolean FileUpload(String locator, String filePath, Action type) {
    WebDriverWait explicitWait = new WebDriverWait(driver, 10);

    WebElement element = explicitWait.until(ExpectedConditions.elementToBeClickable( By.xpath(locator) ));
    if( type == Action.SEND_KEYS ) {
        element.sendKeys( filePath );
        return true;
    } else if ( type == ActionType.FILE_DETECTOR ) {
        LocalFileDetector detector = new LocalFileDetector();
        File localFile = detector.getLocalFile( filePath );
        RemoteWebElement input = (RemoteWebElement) driver.findElement(By.xpath(locator));
        input.setFileDetector(detector);
        input.sendKeys(localFile.getAbsolutePath());
        input.click();
        return true;
    } else {
        try {
            element.click();

            Thread.sleep( 1000 * 5 );

            setClipboardData(filePath);

            Robot robot = new Robot();
            if( type == Action.MAC ) { // Apple's Unix-based operating system.

                // “Go To Folder” on Mac - Hit Command+Shift+G on a Finder window.
                robot.keyPress(KeyEvent.VK_META);
                robot.keyPress(KeyEvent.VK_SHIFT);
                robot.keyPress(KeyEvent.VK_G);
                robot.keyRelease(KeyEvent.VK_G);
                robot.keyRelease(KeyEvent.VK_SHIFT);
                robot.keyRelease(KeyEvent.VK_META);

                // Paste the clipBoard content - Command ⌘ + V.
                robot.keyPress(KeyEvent.VK_META);
                robot.keyPress(KeyEvent.VK_V);
                robot.keyRelease(KeyEvent.VK_V);
                robot.keyRelease(KeyEvent.VK_META);

                // Press Enter (GO - To bring up the file.)
                robot.keyPress(KeyEvent.VK_ENTER);
                robot.keyRelease(KeyEvent.VK_ENTER);
                return true;
            } else if ( type == Action.WIN || type == Action.LINUX ) { // Ctrl + V to paste the content.

                robot.keyPress(KeyEvent.VK_CONTROL);
                robot.keyPress(KeyEvent.VK_V);
                robot.keyRelease(KeyEvent.VK_V);
                robot.keyRelease(KeyEvent.VK_CONTROL);
            }

            robot.delay( 1000 * 4 );

            robot.keyPress(KeyEvent.VK_ENTER);
            robot.keyRelease(KeyEvent.VK_ENTER);
            return true;
        } catch (AWTException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    return false;
}

ファイル アップロード テスト:-fileUploadBytes.htmlをクリックすると、ファイルを見つけることができますTry it Yourself

public static void uploadTest( RemoteWebDriver driver ) throws Exception {
    //driver.setFileDetector(new LocalFileDetector());
    String baseUrl = "file:///D:/fileUploadBytes.html";
    driver.get( baseUrl );
    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

    FileUpload("//input[1]", "D:\\log.txt", Action.SEND_KEYS);

    Thread.sleep( 1000 * 10 );

    FileUpload("//input[1]", "D:\\DB_SQL.txt", Action.WIN);

    Thread.sleep( 1000 * 10 );

    driver.quit();
}

Selenium の使用: sendKeys()ローカル コンピュータから Grid-Node サーバーにファイルを転送する (ローカル ファイルを参照する) 場合は、setFileDetector メソッドを使用する必要があります。この Selenium-Client を使用すると、JSON Wire Protocol 経由でファイルが転送されます。詳細については、saucelabs fileUpload Example

driver.setFileDetector(new LocalFileDetector());
于 2017-09-27T11:51:05.580 に答える
-1

または、webdriver でバックアップされたセレンを使用することもできます -

Selenium selenium = new WebDriverBackedSelenium(driver, baseUrl);

アップロード要素で通常のタイプを実行します-

selenium.sendKeys("file path")
于 2011-10-06T07:00:22.377 に答える