33

我是一個javascript/java開發人員,我一直在試圖弄清楚selenium webdriver自動化框架如何從文件系統上傳文件。通過JavaScript設置文件輸入是不可能的,因爲這是違反安全的。但不知怎麼的webdriver可以用下面的命令來做到這一點:selenium webdriver如何將文件上傳到瀏覽器?

driver.setFileDetector(new LocalFileDetector()); 
WebElement upload = driver.findElement(By.id("myfile")); 
upload.sendKeys("/Users/sso/the/local/path/to/darkbulb.jpg"); 
driver.findElement(By.id("submit")).click(); 

因此,他們正在設置發送鍵,值嗎?我不明白。我已經查看了通過在這裏找到的源代碼: http://code.google.com/p/selenium/source/checkout 我仍然無法找到他們在哪裏做到這一點。

編輯:我的問題不是如何用硒做到這一點,但硒開發商是如何做到這一點的?他們是如何解決javascript中的安全限制的?他們如何上傳文件?

+0

我的第一個猜測是,該按鈕元素有一個「價值」的微博,增加的SendKeys字符的價值? – djangofan

回答

17

尼斯問題哥們......他們已經寫了一個HTTP代理服務器來解決的Javascript secuirty限制。通過使用此代理,可以避免「相同主機源」策略的許多限制,瀏覽器不允許Javascript調用除當前頁面所服務的服務器以外的其他任何內容。

此外WebDriver使用觸發OS級別事件的替代方法。由於這些「本地事件」不是由瀏覽器生成的,因此這種方法避開了對合成事件的安全限制,並且因爲它們是操作系統特定的,所以一旦它們在特定平臺上爲一個瀏覽器工作,則在另一個瀏覽器中重用代碼是相對簡單。

大部分內容上面從引用below..do閱讀硒更多詳細信息如下參考的內部構件

http://www.aosabook.org/en/selenium.html

+0

請參閱下面的答案。 – djangofan

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

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

試試這個,讓我知道

+0

對不起,我不清楚我的問題。我增加了對這個問題的澄清。我想知道硒的開發者是如何完成你所描述的可能性的。 – justspamjustin

0

在某些情況下,特別是與Java中,你需要創建一個文件對象,通過absolutePath()到驅動程序,如下所示:

File file = new File(sampleFile); 
driver.findElement(By.id("<Your input tag with type of File>")).sendKeys(file.getAbsolutePath()); 

樣品文件是指向需要被上傳的文件的字符串。 這適用於Firefox和Chrome瀏覽器。

4

上傳WINDOWNS文件功能的HTML代碼爲:

<input id="fileField" type="file" onchange="document.getElementById('textfield').value=this.value" name="position"> 

<input type="submit" value="導入"> 

您可以使用下面的代碼來完成上傳Windows文件。它工作成功,代碼不包括點擊上傳操作。

driver.FileDetector = new LocalFileDetector(); 
FindElement(By.Id("fileField")).SendKeys(@"C:\Users\admin\Desktop\ProfessionCodes.txt"); FindElement(By.CssSelector("input[type='submit']")).Click(); 
2

我在Facebook 上傳照片使用硒的webdriver和AutoIt的

步驟如下

步驟1

在蝕代碼高達(上傳照片)是如下:

WebElement Upload = Firefox.findElement(By.cssSelector("input[id^='u_']")); 
Upload.click(); 

步驟2

下載和安裝的AutoIt:http://www.autoitscript.com/site/autoit/downloads/(下載ZIP)

步驟3

編寫代碼,如下在記事本中,並保存它作爲PhotoUpload.au3

WinWaitActive("File Upload") 
Send("D:\Photo0116.jpg") 
Send("{ENTER}") 

步驟4 :右鍵單擊這個.au3文件&編譯它。

步驟5:在下面的腳本文件添加代碼:

try { 
    String[] commands = new String[]{}; 
    // Location of the autoit executable 
    commands = new String[] {"D:\\My softwares\\install software\\selenium\\UploadPhoto3.exe"}; 
    Runtime.getRuntime().exec(commands); 
}  
catch (IOException e) {} 

步驟6:運行腳本(PhotoUpload.java

步驟7:照片獲得成功上傳。

+0

你可以說一些截圖編碼和用戶界面? –

0

幫我做文件上傳,

代碼:

public class FileUpload { 
     @Test 
     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")); 
      /* 
      * driver.switchTo().activeElement() 
      * .sendKeys("selenium_2_testing_tools.pdf"); ; 
      */ 
     { 
       driver.wait(30000); 
      } catch (Exception er) { 
       System.out.println(er); 
      } 

     } 
    } 
相關問題