私はSelenium WebDriverとJavaを使用しており、ファイルのアップロード機能を自動化する必要があります。何度も試しましたが、[参照]ボタンをクリックして新しいウィンドウが開き、スクリプトが実行を停止しました。私はFireFoxとIEドライバの両方で試しましたが、役に立ちませんでした。
Autoit exeファイルを呼び出して試しましたが、[参照]ボタンをクリックして新しいウィンドウが開くので、特定のステートメント
Runtime.getRuntime().exec("C:\\Selenium\\ImageUpload_FF.exe")
実行できませんでした。親切に助けて
これは、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());
Alexの答えに何かを追加する必要があると思います。
次のコードを使用して[開く]ウィンドウを開こうとしました:
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);
ボタンをクリックして、以下のコードを使用します。 パス名で'\'の代わりに'\\'を使用していることに注意してください。コードが機能することが重要です。
WebElement file_input = driver.findElement(By.id("id_of_button"));
file_input.sendKeys("C:\\Selenium\\ImageUpload_FF.exe");
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();
_
Java Selenium: sendKeys()
または _Robot Class
_ を使用してファイルをアップロードします。
このメソッドは、指定したファイルパスをクリップボードに設定します。
tell full Path of file
_ への方法。_public static void setClipboardData(String filePath) {
StringSelection stringSelection = new StringSelection( filePath );
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(stringSelection, null);
}
_
OK
を押してファイルを選択します。Go To Folder
_ "- Command ⌘ + Shift + G.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()ローカルコンピューターからグリッドノードサーバーにファイル(ローカルファイルを参照)を転送する場合は、setFileDetectorメソッドを使用する必要があります。 。このSelenium-Clientを使用すると、JSON Wire Protocolを介してファイルが転送されます。詳細については _saucelabs fileUpload Example
_ を参照してください
_driver.setFileDetector(new LocalFileDetector());
_
モーダルダイアログが開いた直後は、スクリプトは機能せず、ハングします。したがって、最初にautoit.exe
を呼び出し、次にクリックしてモーダルダイアログを開きます。
それはこのようにうまく機能します、
Runtime.getRuntime().exec("Upload_IE.exe");
Selenium.click("//input[@name='filecontent']");
私もSelenium Webdriverと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);
以上です。それは私のために働いています、私はそれがあなたの何人かのために働くことを望みます。