2011-04-19 59 views
0

那麼我知道硒世界充滿了文件上傳線程,這是我今天碰到的並且到目前爲止還沒有能夠解決的問題。儘管通過使用FF瀏覽器輸入文件上傳的文件輸入文本框來解決了這些問題。Selenium2 +另一個文件上傳

所以首先沒有文件輸入框。它只是一個按鈕,它會彈出一個選擇文件的文件,只要您選擇文件,上傳就會自動啓動。 HTML看起來像 -

<div id="container" style="position: relative;"> 
     <div id="filelist"></div> 
     <br> 
     <a id="pickfiles"> 
     <input type="button" name="Photos" value="Pick a File"></a> 
     <div id="p15tlsibt1185d1pi41tbd16c31a0n0_flash_container" style="position: absolute; top: 21px; background: none repeat scroll 0% 0% transparent; z-index: 99999; width: 86px; height: 18px; left: 0px;" class="plupload flash"><object width="100%" height="100%" data="/CKFinder/upload/content/runtimes/plupload.flash.swf" type="application/x-shockwave-flash" style="outline: 0pt none; background-color: transparent;" id="p15tlsibt1185d1pi41tbd16c31a0n0_flash"><param value="/CKFinder/upload/content/runtimes/plupload.flash.swf" name="movie"><param value="id=p15tlsibt1185d1pi41tbd16c31a0n0" name="flashvars"><param value="transparent" name="wmode"><param value="always" name="allowscriptaccess"></object></div></div> 

所以我嘗試使用id /名稱等點擊,但無濟於事。我試過這樣的點擊 -

Commons.clickById(webDriver, "pickfiles") 

但是頁面上沒有任何反應。

我也嘗試 - 代碼片段貼在這裏,它使用Java腳本exectuion -

cant click button which opens file attachment dialog

,但無濟於事。我總是遇到錯誤陳述 -

System.InvalidOperationException : arguments[0].click is not a function (UnexpectedJavaScriptError) 

有什麼建議嗎?

+0

我能夠點擊按鈕,因爲我之前通過錯誤的會話是錯誤的。儘管點擊按鈕並不能解決問題,因爲我需要在彈出的窗口中點擊文件進行選擇,並且文件結構在機器之間不會保持不變。我想用後臺調用來執行文件上傳,可能會使用HTMLUnit而不是瀏覽器。但是,但我需要選擇文件....一些如何... – Tarun 2011-04-19 09:13:49

+0

看起來像我非常嚴重堅持這一點, 有沒有輸入框鍵入文件路徑和選擇文件從彈出窗口是非常糟糕的執行:( – Tarun 2011-04-19 13:56:56

回答

0

,並得到使用的AutoIt的解決方案,這裏是示例腳本 -

AutoItX3Lib.AutoItX3 au3 = new AutoItX3Lib.AutoItX3(); 
au3.WinWait("Select file to upload"); 
au3.WinActivate("Select file to upload"); 
au3.Send("C:\\Documents and Settings\\user\\Desktop\\area51.png"); 
au3.Send("{ENTER}"); 

我希望它可以幫助別人

+0

你可以請發表完整的代碼,你如何得到它的工作:)?我有一些問題和完全相同的情況 – Mihai 2013-04-04 09:55:11

0

首先我必須創建一個小班找出哪個窗口是開放的並將它們作爲窗口字典返回。

public static IDictionary<string, IntPtr> GetOpenWindows() 
{ 
    IntPtr lShellWindow = GetShellWindow(); 
    Dictionary<string, IntPtr> lWindows = new Dictionary<string, IntPtr>(); 
    EnumWindows(delegate(IntPtr hWnd, int lParam) 
    { 
     if (hWnd == lShellWindow) return true; 
     if (!IsWindowVisible(hWnd)) return true; 
     int lLength = GetWindowTextLength(hWnd); 
     if (lLength == 0) return true; 

     StringBuilder lBuilder = new StringBuilder(lLength); 
     GetWindowText(hWnd, lBuilder, lLength + 1); 
     lWindows[lBuilder.ToString()] = hWnd; 
     return true; 
    }, 0); 

    return lWindows; 
} 

public delegate bool EnumDelegate(IntPtr hWnd, int lParam); 
public delegate bool EnumedWindow(IntPtr handleWindow, ArrayList handles); 

[DllImport("USER32.DLL")] 
public static extern bool EnumWindows(EnumDelegate enumFunc, int lParam); 

[DllImport("USER32.DLL")] 
public static extern IntPtr GetShellWindow(); 

[DllImport("USER32.DLL")] 
public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount); 

[DllImport("USER32.DLL")] 
public static extern int GetWindowTextLength(IntPtr hWnd); 

[DllImport("USER32.DLL")] 
public static extern bool IsWindowVisible(IntPtr hWnd); 

[DllImport("user32.dll")] 
public static extern bool SetForegroundWindow(IntPtr hWnd); 

在Selenium頁面代碼中,我點擊按鈕啓動下載窗口,並放入一個短暫的等待。 (這不是代碼所示)

然後我用下面的代碼查找所有打開的窗口

IDictionary<string, IntPtr> getOpenWindows = GetOpenWindows(); 

切換到下載窗口(窗口的名稱是跨瀏覽器的不同。注意! )

IntPtr hWnd = getOpenWindows["File Upload"]; 
SetForegroundWindow(hWnd); 

路徑鍵入文件

SendKeys.SendWait(filename); 

按Enter

SendKeys.SendWait(@"{Enter}"); 

的下載窗口應關閉,所以我們切換回瀏覽器窗口(在這種情況下,火狐)

hWnd = getOpenWindows["Mozilla Firefox"]; 
SetForegroundWindow(hWnd); 

有幾個問題以此爲窗口標題,這取決於不同瀏覽器正在被使用,所以這需要考慮到一個完整的解決方案。此外,當這部分代碼執行時,不要將任何其他窗口置於前臺,因爲此窗口將接收'SendKeys'而不是所需的窗口。

相關問題