2013-06-03 77 views
47

Có ai cho tôi biết cách tải lên tệp bằng Selenium bằng mã Java không?Cách tải lên tệp bằng cách sử dụng Selenium WebDriver trong Java

Khi tôi nhấp vào nút trong ứng dụng được mở trong cửa sổ mới, những gì tôi có thể sử dụng để chọn tệp tải lên. Nút duyệt được phát triển bởi Silverlight (C#).

+0

Chào mừng bạn đến với Mahesh - bạn có thể cho chúng tôi biết thêm một chút nữa không? Có lẽ đăng ảnh chụp màn hình và/hoặc mã của ứng dụng web của bạn và hiển thị cho chúng tôi mã trình quản lý web mà bạn đã phát triển cho đến thời điểm này? –

Trả lời

74

Trước tiên hãy chắc chắn rằng các yếu tố đầu vào là có thể nhìn thấy

Như đã nêu Mark Collin trong các cuộc thảo luận here:

Đừng click vào nút duyệt, nó sẽ kích hoạt một cấp hệ điều hành đối thoại và dừng thử nghiệm hiệu quả.

Thay vào đó bạn có thể sử dụng:

driver.findElement(By.id("myUploadElement")).sendKeys("<absolutePathToMyFile>");

myUploadElement là id của nguyên tố đó (nút trong trường hợp này) và trong SendKeys bạn phải xác định đường dẫn tuyệt đối của nội dung bạn muốn tải lên (Hình ảnh, video, v.v.). Selenium sẽ làm phần còn lại cho bạn.

Hãy ghi nhớ rằng việc tải lên sẽ làm việc chỉ Nếu phần tử bạn gửi một tập tin nên được ở dạng <input type="file">

+1

Tôi đã thêm cùng một mã .. nhưng nó không hoạt động –

+1

Xin chào @ArupRakshit, nó sẽ là tuyệt vời nếu bạn đưa ra ý chính của mã ở đây. Để chúng ta có thể xem xét tại sao nó không hoạt động. Cảm ơn. –

+4

Bạn có thể sử dụng mã sau để lấy đường dẫn tuyệt đối của tệp và tải lên nội dung 'Chuỗi tệpPath = System.getProperty (" user.dir ") +" /src/res/test.pdf; driver.findElement (By.id ("keyID")) sendKeys (filePath); ' – gihanchanuka

9
driver.findElement(By.id("urid")).sendKeys("drive:\\path\\filename.extension"); 
3

Nếu bạn có một hộp văn bản để nhập đường dẫn tập tin, chỉ cần sử dụng sendkeys để nhập đường dẫn tệp và nhấp vào nút gửi. Nếu không có hộp văn bản để nhập đường dẫn tệp và chỉ có thể bấm vào nút duyệt và để chọn tệp từ cửa sổ bật lên, bạn có thể sử dụng công cụ AutoIt, xem bước dưới đây để sử dụng AutoIt cho tương tự,

  1. Tải về và cài đặt công cụ AutoIt từ http://www.autoitscript.com/site/autoit/

  2. Chương mở -> AutoIt công cụ -> SciTE Script Editor.

  3. Dán đoạn mã sau trong trình soạn thảo AutoIt và lưu nó như là “filename.exe“(ví dụ: new.exe)

    Sau đó, biên dịch và xây dựng các tập tin để làm cho nó exe. (Tools → Compile)

AutoIt Code:

WinWaitActive("File Upload"); Name of the file upload window (Windows Popup Name: File Upload)  
Send("logo.jpg"); File name  
Send("{ENTER}") 

Sau đó, Biên dịch và xây dựng từ menu Tools của công cụ AutoIt -> SciTE Script Editor.

Dán dưới mã Java trong trình soạn thảo Eclipse và lưu

Java Code:

driver.findElement(By.id("uploadbutton")).click; // open the Upload window using selenium  
Thread.sleep("20000"); // wait for page load  
Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + "C:\\Documents and Settings\\new.exe"); // Give path where the exe is saved. 
+0

Làm tốt lắm! :-) Tôi đã cải tiến kịch bản một chút: https://stackoverflow.com/questions/14592853/how-to-upload-a-file-in-selenium-with-no-text-box#48578616 – SharpC

8

Đây là những gì tôi sử dụng để tải lên các hình ảnh thông qua cửa sổ upload:

//open upload window 
    upload.click(); 

    //put path to your image in a clipboard 
    StringSelection ss = new StringSelection("C:\\IMG_3827.JPG"); 
    Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, null); 

    //imitate mouse events like ENTER, CTRL+C, CTRL+V 
    Robot robot = new Robot(); 
    robot.keyPress(KeyEvent.VK_ENTER); 
    robot.keyRelease(KeyEvent.VK_ENTER); 
    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); 

làm

+0

Ngọt nhưng đây là chìa khóa sự kiện không phải là sự kiện chuột (rõ ràng) .Vì vậy, ý tưởng tuyệt vời ... –

+0

nó không đóng cửa sổ tải lên cho tôi – mosaad

-1

Tìm thẻ là type="file". thẻ chính này được hỗ trợ bởi selen. Nếu bạn có thể xây dựng XPath của bạn giống nhau khi được khuyến nghị.

  • sendkeys sử dụng cho nút có tùy chọn trình duyệt (Nút đó sẽ mở ra hộp cửa sổ của bạn để chọn file)
  • Bây giờ hãy nhấp vào nút đó là sẽ tải lên tập tin của bạn

Như dưới đây: -

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

Đối với nhiều tập tin tải lên đưa tất cả các file từng người từng người sendkeys và sau đó click vào upload

driver.findElement(By.xpath("//input[@id='files']")).sendKeys("D:"+File.separator+"images"+File.separator+"Lighthouse.jpg""); 
driver.findElement(By.xpath("//input[@id='files']")).sendKeys("D:"+File.separator+"images"+File.separator+"home.jpg"); 
driver.findElement(By.xpath("//input[@id='files']")).sendKeys("D:"+File.separator+"images"+File.separator+"tsquare.jpg"); 
Thread.sleep(5000); 
driver.findElement(By.xpath("//button[@id='Upload']")).click(); // Upload button 
+0

Nó không làm việc cho tôi –

+0

chia sẻ mã HTML của bạn .. nó phải hoạt động .. xem tài liệu selenium: - https: //saucelabs.com/resources/articles/selenium-file-upload Tôi đang sử dụng cùng –

+0

nó cũng phụ thuộc vào hệ điều hành bạn đang sử dụng nếu bạn đang sử dụng cửa sổ sau đó sử dụng \\ và nếu Linux hoặc mac sau đó // –

2

Tôi đã cố gắng sử dụng các robot trên có một cần phải thêm một sự chậm trễ :( cũng có thể bạn không thể gỡ lỗi hoặc làm cái gì khác bởi vì bạn mất tập trung :(

// cửa sổ mở, tải lên upload.click();

//put path to your image in a clipboard 
StringSelection ss = new StringSelection(file.getAbsoluteFile()); 
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, null); 

//imitate mouse events like ENTER, CTRL+C, CTRL+V 
Robot robot = new Robot(); 
robot.delay(250); 
robot.keyPress(KeyEvent.VK_ENTER); 
robot.keyRelease(KeyEvent.VK_ENTER); 
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.delay(50); 
robot.keyRelease(KeyEvent.VK_ENTER); 
+0

Bạn có thể giải thích các bước bấm phím robot chính xác những gì happing khi các lệnh trên được gọi là? –

+0

Nhấn enter, dán văn bản và nhấn Enter lần nữa – blizz

Các vấn đề liên quan