2012-06-29 26 views
28

Widziałem wiele pytań i rozwiązań dotyczących przesyłania plików za pomocą Selenium WebDriver na Stackoverflow. Ale żaden z pracujących dla następującego scenariusza.Jak obsługiwać przesyłanie plików systemu Windows za pomocą Selenium WebDriver?

Ktoś dał rozwiązanie następująco

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

Ale nadal nie mogę znaleźć uchwyt okna, jak mogę pracować na tym ??

Screenshot

szukam rozwiązania dla powyższego scenariusza

Proszę to sprawdzić dla każdego z następującej strony internetowej

http://www.uploadify.com/demos/ 
http://www.zamzar.com/ 
+0

Więc spróbowałeś tego, co napisałeś? Jeśli zrobiłeś to, co napisałeś i jaki był błąd? – Amey

+0

To jest założenie, aby obsłużyć wyskakujące okno winwods –

+0

Po prostu pytam, czy dałeś temu podejściu ujęcie? – Amey

Odpowiedz

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

Hej, to mój skądś :).


W przypadku Zamzar internecie, to powinno działać idealnie. Ty nie klikaj elementu. Po prostu wpisujesz do niego ścieżkę. Aby być konkretne, powinno to być absolutnie ok:

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

W przypadku Uploadify internecie, jesteś w zalewie, ponieważ rzeczą przesyłanie ma input, ale obiekt Flash. Nie ma interfejsu API dla WebDriver, który umożliwiałby pracę z oknami dialogowymi przeglądarki (lub obiektami Flash).

Po kliknięciu elementu Flash pojawi się okno, nad którym nie będziesz mieć kontroli. W przeglądarkach i systemach operacyjnych, które znam, można założyć, że po otwarciu okna kursor znajduje się na wejściu File name. Upewnij się, że to założenie jest prawdziwe również w twoim przypadku.

Jeśli nie, można spróbować skoczyć do niego naciskając Alt + N, przynajmniej na Windows ...

Jeśli tak, możesz „na ślepo” wpisać ścieżkę do niego przy użyciu klasy Robot . W twoim przypadku, to byłoby coś na drodze:

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

To jest do bani, ale to powinno działać. Zauważ, że możesz potrzebować tych: How can I make Robot type a `:`? i Convert String to KeyEvents (plus jest nowe i błyszczące KeyEvent#getExtendedKeyCodeForChar(), które wykonuje podobną pracę, ale jest dostępne tylko z JDK7).


pamięć flash, jedyna alternatywa wiem (od this discussion) jest skorzystanie z ciemną technika:

Po pierwsze, należy zmodyfikować kod źródłowy ciebie aplikacji Flash, odsłaniając metody wewnętrznych za pomocą interfejs API ExternalInterface ActionScript. Po ujawnieniu te metody będą wywoływalne przez JavaScript w przeglądarce.

Po drugie, teraz, gdy JavaScript może wywoływać wewnętrzne metody w twojej aplikacji flashowej, używasz WebDriver do wywołania JavaScript na stronie internetowej, która będzie następnie zadzwonić do twojej aplikacji flashowej.

Ta technika jest dokładniej wyjaśniona w dokumentacji projektu flash-selenium. (http://code.google.com/p/flash-selenium/), ale idea techniki odnosi się równie dobrze do WebDriver.

+1

Nie działa, musisz znaleźć coś innego –

+2

Co oznacza "nie działa"? Dlaczego, gdzie, z jakim komunikatem o błędzie? –

+0

Nie można przejść do ścieżki pliku do okna przesyłania plików –

1

importu System.Windows.Forms binarny do badanego roztworu i wywołać następujące dwa LOC na kliknięcie przycisku Prześlij na UI.

 // 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}"); 
8

poniższy kod działa dla mnie:

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")); 
+2

To powinna być odpowiedź. sendKeys() po prostu nie daje żadnego wyniku, ale ten działa idealnie. Używam GhostDriver na Ubuntu. – Guillaume

0

Alternatywnym rozwiązaniem byłoby napisanie skryptu do automatyzacji dialogowe Otwórz plik. Zobacz AutoIt.

Ponadto, jeśli nie można „kliknąć” element, mój obejście jest na ogół to zrobić:

element.SendKeys(Keys.Enter); 

nadzieję, że to pomaga (Mimo to stary post)

1

Poniżej prac kodowych dla mnie:

// 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(); 
+0

Czym jest ten "robot"? – jcyrss

0

możliwość wprowadziły podwójny ukośnik \\ dla całej ścieżki bezwzględnej, aby osiągnąć ten przykład: - D: \\ images \\ Lighthouse.jpg

Steps - stosowanie SendKeys dla opcji przycisku konieczności przeglądania (przycisk, który otworzy swoją skrzynkę okna, aby wybrać pliki) - Teraz kliknij na przycisk, który zamierza przesłać złożyć

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

Używanie C# i Selenium ten kod jest tutaj dla mnie, UWAGA będziesz chciał użyć parametru do zamiany "localhost" w wywołaniu FindWindow dla danego serwera, jeśli nie jest to localhost i śledzenie, które jest najnowszym dialogiem otwartym jeśli istnieje więcej niż jedno okno dialogowe, ale powinno się zacząć:

[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}"); 
     } 
    } 
-1

Poniższa jeden pracował dla mnie

webDriver.findElement(By.xpath("//input[@type='file' and @name='importFile']")).sendKeys("C:/path/to/file.jpg"); 
1

istnieje prostszy sposób, aby rozwiązać ten problem, to co opisano Slanec. Jego rozwiązanie działa, gdy używasz angielskiej klawiatury, jeśli nie, będziesz miał trudności z "mapowaniem" klucza dla znaków specjalnych.

Zamiast robot.keyPress i robot.keyRelease każdy klucz można użyć Toolkit, aby skopiować ciąg do schowka, a następnie wkleić go.

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); 
0

Pierwszy dodać plik do katalogu zasobów projektu

następnie

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

Walla, wyświetlony zostanie wybrane wybrany plik, i pomijane okno pliku Explorer

0

I wykorzystał sendkeys w skryptach powłoki przy użyciu pliku vbsscript. Poniżej znajduje się kod w pliku VBS,

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

poniżej jest linia kodu selen, aby uruchomić ten plik vbs,

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

Podwójne ukośniki w ścieżce, na przykład:

driver.findElement(browsebutton).sendKeys("C:\\Users\\Desktop\\Training\\Training.jpg"); 
0

Użyj skryptu AutoIt do obsługi przesyłania plików w Selenium Webdriver. Dla powyższego scenariusza wszystko działa dobrze.

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

proszę skorzystać z poniższego linku w celu uzyskania pomocy: http://www.guru99.com/use-autoit-selenium.html

0

Znajdź element (musi być elementem wejście z type = "file" atrybutu) i wysłać ścieżkę do pliku.

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

UWAGA: Jeśli korzystasz z RemoteWebDriver, będziesz musiał ustawić detektor plików. Domyślną wartością jest UselessFileDetector

WebElement fileInput = driver.findElement(By.id("uploadFile")); 
driver.setFileDetector(new LocalFileDetector()); 
fileInput.sendKeys("/path/to/file.jpg"); 
0
 webDriver.FindElement(By.CssSelector("--cssSelector--")).Click(); 
     webDriver.SwitchTo().ActiveElement().SendKeys(fileName); 

działa dobrze dla mnie. Podjęcie innego podejścia podanego w odpowiedzi powyżej przez Matta w C# .net może również działać z nazwą klasy # 32770 dla pola przesyłania.

Powiązane problemy