2014-03-01 59 views
1

短:硒FindElement塊,直到文件上傳完畢

當我觸發使用的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()

進度一直持續到響應,此時最終對話框顯示一些結果並可以用另一個按鈕解除。

因此,在短暫的:

  1. 在對話框中打開一個對話框
  2. 一套模板介紹
  3. 在對話框中選擇一個文件
  4. 變更模板進步
  5. 踢掉了ajax(或iframe)上傳
  6. 在對話框中更改模板以完成

硒無法訪問文件上傳輸入(隱藏),因此要獲得硒觸發文件上傳,我最後不得不執行一些這樣的腳本:

  1. 添加一個新的輸入元素:

    jQuery的( '',{ID: 'tmpId',類型: '文件',名稱: '文件[]'})。appendTo( 'modalDivId')

  2. 觸發回調:

    $('#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。

有什麼想法?

回答

1

表單在過程中的任何地方提交?我的意思是提交被觸發任何地方或刷新或點擊elemnet或類似?問題是webdriver是一個阻塞API,當觸發加載/刷新或類似時,webdriver將檢查各種事情以檢查頁面是否完成加載(即document.readyState =='complete')等。

無論如何,應該可以重寫此策略,您可以嘗試調查page load strategies

+0

表單正在通過添加回調中的jquery插件(data.submit())提交。那麼,你是否說我創建的webdriver可能在ajax post期間被阻塞(等待它完成)?這聽起來像我不能在每個呼叫的基礎上重寫這個策略?我想如果我改變策略,它會弄亂我的其他測試。我想知道我是否可以使用多個驅動程序。我會研究這一點,並回到標記答案。 –

+0

我真的不太瞭解使用頁面加載策略,他們在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)並使用顯式等待來確保頁面已加載。 –

+0

「這聽起來像是我無法在每個呼叫的基礎上重寫此策略?」 - 我很確定這是每個駕駛員的事情。 –

0

如果你想等待AJAX​​操作,您可以使用這樣的事情

  var ajaxIsComplete = javaScriptExecutor != null && (bool)javaScriptExecutor.ExecuteScript("return jQuery.active == 0"); 

上面的代碼將返回true,如果沒有在頁面沒有AJAX的活動,但我建議你使用等待

 var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(time)); 
     wait.Until(ElementIsClickable(locator); 

如果你想給你的等待時間像60 120秒等。它將持續期間,直到元素變得不阻塞等待

我覺得這個最好的解決辦法如果你認爲我誤解了你的Que請讓我知道

+0

你錯過了這個問題。 「我真的想在上傳過程中訪問DOM,有什麼想法?」 –

+0

您想要驗證進度欄是否正確,您是否在進度欄上放置了任何塊UI –