2012-01-13 41 views

Trả lời

26

Nếu bạn đang cố gắng chọn tệp để tải lên, Selenium 2 hỗ trợ đầu vào tệp HTML. Ví dụ:

HTML

<input type="file" id="uploadhere" /> 

Selenium Mã

IWebElement element = driver.FindElement(By.Id("uploadhere")); 
element.SendKeys("C:\\Some_Folder\\MyFile.txt"); 

Về cơ bản bạn "loại" (với SendKeys) đường dẫn tập tin đầy đủ đến các yếu tố đầu vào tập tin. Selenium xử lý hộp thoại chọn tệp cho bạn.

Tuy nhiên nếu bạn muốn thao tác hộp thoại chọn tệp tùy ý, thì như Anders đã nói, bạn phải ra ngoài Selenium.

+0

này làm việc cho tôi ngay cả với trang web đã giấu đầu vào tập tin. –

+0

Tôi không thể làm việc này trên Firefox trong Selenium 2.48. –

7

Không, WebDriver không thể tương tác với hộp thoại - điều này là do hộp thoại là miền của hệ điều hành chứ không phải trang web.

Tôi biết những người đã có may mắn với tính năng tự động cũng như API Tự động hóa do .Net cung cấp.

Tùy chọn khác sẽ bỏ qua hộp thoại tệp hoàn toàn và phát hành POST hoặc GET, nhưng điều này đòi hỏi kiến ​​thức nâng cao hơn về trang web cũng như hiểu cách xây dựng POST/GET.

Bạn có thể thử Webinator, nó tương tự như Selen theo nghĩa là nó được cung cấp bởi WebDriver. Nó cung cấp khả năng thoại hộp thoại và tôi đã thành công lớn với nó.

3

Đây là một giải pháp khác bằng cách sử dụng remotewebdriver, nó hoạt động giống như phép thuật và tôi thích nó.

Đây là lớp tôi có:

driver.findElementByLinkText("Upload Files").click(); 
driver.setLogLevel(Level.ALL); 
System.out.println(driver.getCurrentUrl()); 
WebElement element = driver.findElement(By.xpath("//input[@name='file_1']")); 
LocalFileDetector detector = new LocalFileDetector(); 

//Now, give the file path and see the magic :)    
String path = "D://test66T.txt"; 
File f = detector.getLocalFile(path); 
((RemoteWebElement)element).setFileDetector(detector); 
element.sendKeys(f.getAbsolutePath()); 

//now click the button to finish 
driver.findElementByXPath("//html/body/div[9]/div[1]/a/span").click(); 
+0

Điều này hoạt động hoàn hảo, tiết kiệm một nhức đầu rất lớn cần phải đối phó với có phần mềm bổ sung được cài đặt trên một hộp kiểm tra (chẳng hạn như AutoIT, et. Al.) – nerdwaller

+1

Đây có phải là một ràng buộc Java không? Bởi vì trong C# tôi không thể tìm thấy một phương thức getLocalFile trong LocalFileDetector https://selenium.googlecode.com/git/docs/api/dotnet/html/AllMembers_T_OpenQA_Selenium_Remote_LocalFileDetector.htm –

-1

Nếu bạn muốn tải lên một tập tin, và không sử dụng WebDriver, giải pháp duy nhất mà tôi đã đi qua là AutoIt. Nó cho phép bạn viết một kịch bản và chuyển nó thành một tệp thực thi mà bạn có thể gọi từ bên trong mã của bạn. Tôi đã sử dụng nó thành công trong khi làm việc với một điều khiển ActiveX.

0

Cách tiếp cận khác là sử dụng System.Windows.Forms.SendKeys.SendWait("pathToFile").
Tôi sử dụng nó với thành công ở khắp mọi nơi mà tôi không thể chỉ gửi các phím đến phần tử như được mô tả bởi @prestomanifesto.

1

According to Nadim Saker

Net có một thư viện để xử lý hộp thoại tập tin tải lên. Nó có một lớp SendKeys có một phương thức SendWait (các khóa chuỗi). Nó sẽ gửi khóa đã cho trên ứng dụng đang hoạt động và đợi thông báo được xử lý. Nó không trả về bất kỳ giá trị nào.

1

Điều này có thể được thực hiện như sau, kiểm tra và làm việc với Internet Explorer và tài xế Chrome

var allowsDetection = this.Driver as IAllowsFileDetection; 
if (allowsDetection != null) 
{ 
    allowsDetection.FileDetector = new LocalFileDetector(); 
} 

Driver.FindElement(By.Id("your-upload-input")).SendKeys(@"C:\PathToYourFile"); 

Reference https://groups.google.com/forum/#!msg/webdriver/KxmRZ8MkM4M/45CT4ID_WjQJ

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