2015-12-21 29 views
0

方案:我已經配置電網2現在多個測試並行運行。當測試開始時,打開瀏覽器窗口(僅打開一個選項卡)並在其中填充一些控件。之後,我打開另一個選項卡(在同一個瀏覽器窗口中),切換到它並在其中填充一些控件。

第二個選項卡中填充數據之前,有需要完成以下步驟:
1.打開新的標籤頁通過調用SendKeys(Keys.Ctrl + 't')
2.切換到第二個選項卡等待第二個選項卡的手柄將被添加到之前駕駛員實例。
如果手柄加入到驅動程序實例,然後切換到它,否則4.
4.重複操作2和3,直到超時爲止。
如何打開broswer的標籤遠程機器上

問題: 調試時,我注意到,在打開一個新標籤時,它的手柄沒有添加到driver.WindowHandles。這意味着,如果不檢查句柄是否添加並嘗試切換到該句柄,則會拋出異常。在我的情況下,它會切換到不正確的標籤,因爲我打電話給driver.SwitchTo().Window(handles[handles.Count() -1]);。所以我創建了等待句柄添加的方法。

問題是,在多個員工中運行時,它總是超時。我改變了timeout,但沒有任何變化。新打開的選項卡的句柄未添加到WindowHandles。如果我是而不是並行運行,那麼它按預期工作。

// previousTabCount- browser's tab count before opening new one 
public void WaitForTabToOpenAndSwtich(int previousTabCount) 
{ 
    int currentTabCount = driver.WindowHandles.Count(); 
    int count = 0; 
    while(currentTabCount == previousTabCount) 
    { 
     // after 20 seconds throw exception 
     if(count > 20) 
      throw new Exception("The newly opened tab's handle was not added."); 
     // update current tab count 
     currentTabCount = driver.WindowHandles.Count(); 

     count++; 
     Thread.Sleep(1000); 
    } 

    var handles = driver.WindowHandles; 
    driver.SwitchTo().Window(handles[handles.Count() -1]); 
} 
+0

除非測試的設計從一開始就並行運行,否則我不會感到驚訝,如果它們沒有一些工作並行運行。驅動程序實例是否在所有測試之間共享?如果一個測試添加標籤而另一個測試添加標籤,他們可能會感到困惑。 –

+0

謝謝你的回覆@Sam Holder。是的,我正在使用共享的公共靜態驅動程序實例。但我如何理解Grid 2將測試分離爲工人,每個工人都有自己的驅動實例,並且只在該工人內共享。該工作人員內部的所有測試都是同步運行的,所以它不應該是一個問題。我可能是錯的,但這是我理解它是如何工作的。 – Edgar

回答

0

我找到了解決方案。問題是,當使用SendKeys(Keys.Ctrl + 't')在遠程機器上打開新選項卡時,它不起作用,我不知道爲什麼。幸運的是,我找到了另一種方法。

而不是使用發送鍵的命令,我使用:在新標籤中打開,但

// script that opens a new tab 
driver.ExecuteScript("var w = window.open(); w.document.open();"); 

運行此腳本後,我不能改變它的URL使用
driver.Navigate().GoToUrl("...");
,並引發了異常:

的HTTP請求發送到遠程服務器的webdriver爲URL的 'http://示例.com ' 60秒

後超時

所以我修改該腳本通過在這樣的結尾處增加一個頁面加載了一下:

// script that opens new tab and reloads it 
driver.ExecuteScript("var w = window.open(); w.document.open(); w.location.reload();"); 

這爲我工作。也許有人會覺得這很有用。

相關問題