當我觸發使用的SendKeys(路徑)的代理元素(由ExecuteScript放在文件)的文件上傳是那麼代理我通過了jQuery隱藏.fileupload插件,文件上傳正常,但當我嘗試併發出FindElement
時,它會阻塞,直到服務器響應。
的龍:
我使用的是2.4 C#的網絡驅動器,Firefox的默認驅動程序,和jQuery文件上傳插件(藍色IMP)。
流程開始通過點擊一個按鈕,打開「概要對話框」,裏面有我的
<input id="fileUpload" type="file" name="files[]" accept="video/quicktime,video/x-ms-wmv">
<lablel for="fileUpload">Select a file</label>
對話框的成分之後,我有
jquery('#fileUpload').fileupload(self.fileUploadOptions);
正常使用有用戶單擊觸發輸入的標籤,然後觸發並添加回調,該回調會檢查大小/類型,如果確定,則更改爲PROGRESS對話框,並執行data.submit()
。
進度一直持續到響應,此時最終對話框顯示一些結果並可以用另一個按鈕解除。
因此,在短暫的:
- 在對話框中打開一個對話框
- 一套模板介紹
- 在對話框中選擇一個文件
- 變更模板進步
- 踢掉了ajax(或iframe)上傳
- 在對話框中更改模板以完成
硒無法訪問文件上傳輸入(隱藏),因此要獲得硒觸發文件上傳,我最後不得不執行一些這樣的腳本:
添加一個新的輸入元素:
jQuery的( '',{ID: 'tmpId',類型: '文件',名稱: '文件[]'})。appendTo( 'modalDivId')
觸發回調:
$('#tmpId')。bind('change',function( e){('#fileUpload')。fileupload('add',{ files:e.target.files || [{name:this。值}}, fileInput:$(this) }); });
所以,現在創建tmpId輸入元素之後,我的硒腳本做到這一點:
var path="\path\to\files";
var tmpInput = WebDriver.FindElement(By.Id("tmpId));
tmpInput.SendKeys(path);
這將觸發添加回調,檢查文件,更改模板「進步」,並啓動上傳。 假設上傳需要60秒時間,服務器會響應,然後模板將觸發「完成」
的問題是,雖然:
tmpInput.SendKeys(path);
回報「立即」,所以我打電話
var a = WebDriver.FindElement(By.Id("tmpId"));
這個BLOCKS直到文件上傳完成(60秒)。即使進度條正在更新。
然後返回成功。
因爲我有這個進度模板,我想驗證,我真的想在上傳過程中訪問DOM。
有什麼想法?
表單正在通過添加回調中的jquery插件(data.submit())提交。那麼,你是否說我創建的webdriver可能在ajax post期間被阻塞(等待它完成)?這聽起來像我不能在每個呼叫的基礎上重寫這個策略?我想如果我改變策略,它會弄亂我的其他測試。我想知道我是否可以使用多個驅動程序。我會研究這一點,並回到標記答案。 –
我真的不太瞭解使用頁面加載策略,他們在v2.40(最近一週前發佈)中介紹給FFDriver。你還可以嘗試的一件事是設置[pageLoadTimeout](http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/WebDriver.Timeouts.html#pageLoadTimeout%28long, %20java.util.concurrent.TimeUnit%29)並使用顯式等待來確保頁面已加載。 –
「這聽起來像是我無法在每個呼叫的基礎上重寫此策略?」 - 我很確定這是每個駕駛員的事情。 –