2016-06-08 27 views
1

自從我綜合我的腳本詹金斯,量角器 - 有時測試用例包括窗口處理是失敗的「沒有這樣的窗口」

有時我的測試用例一部分包括switchTo().window(handles[0])都失敗了。

我試圖增加更多等待睡眠之前和之後的行動,但它不會讓我的測試用例穩定。

錯誤:

[31mFatal error: 11:03:56.527 WARN - Exception thrown org.openqa.selenium.NoSuchWindowException: no such window

測試案例,例如:

it('Settings - Redirect to links - FAQ', function() { 
     element.all(by.css("a.faq-link")).first(); 
     browser.wait(EC.elementToBeClickable(element(by.xpath('//*[@id="main"]/div[2]/div/a'))), 30000); 
     browser.driver.sleep(1000); 
     element(by.xpath('//*[@id="main"]/div[2]/div/a')).click(); 

     var mainWindow; 
      browser.driver.getAllWindowHandles().then(
       function(handles) { 
        mainWindow = handles[0]; //at this point there should be only 1 window 
       } 
      ); 

     browser.driver.getAllWindowHandles().then(function (handles) {  
     handles.forEach(function(handle) { 
      if (handle !== mainWindow) { 
       browser.driver.switchTo().window(handle); 
       browser.driver.sleep(3000); 
       expect(browser.driver.getCurrentUrl()).toContain("some url address"); 
      } 
     }); 
    }); 
    }); 

    it(Settings - Staff', function() { 
     element.all(by.css('[ng-click="start_create()"]')).first(); 
     browser.driver.getAllWindowHandles().then(function (handles) { 
     browser.driver.close(); 
     browser.driver.switchTo().window(handles[0]); 
     browser.driver.sleep(3000); 
     }); 
     //-=- switch to iFrame handler -=- 
     browser.driver.switchTo().defaultContent(); // you are now outside both frames 
     browser.driver.switchTo().frame("timegate_iframe"); 
     element(by.css("a.staff.section-item")).click(); 
     browser.driver.sleep(1000); 
     browser.wait(EC.visibilityOf(element(by.css('[ng-click="start_create()"]'))), 30000); 
    }); 

回答

0

可以等待在打開的窗口數量的任何變化。只有然後嘗試發送命令到您當前的窗口。

下面是趕在窗戶數量的任何變化,返回True一個微小的功能/假相應:

def wait_for_diff_in_windows_number(self, timer=10, currentWindows=1): 
    startTime = time.time() 
    openWindows = len(self.driver.window_handles) 
    while (time.time() - startTime) < timer : 
     openWindows = len(self.driver.window_handles) 
     if openWindows != currentWindows : 
      return True 
     else: 
      time.sleep(0.1) 
    return False 
+0

能否請你解釋一下我的JS?我不明白這個的語法..謝謝 –

+0

看到我的答案在下面。這是一個蹩腳的翻譯(我不是JS專家),但它有相同的邏輯 – GonTs

0
function wait_for_diff_in_windows_number(obj, timer, currentWindows) { 
    timer = timer || 10; 
    currentWindows = currentWindows || 1; 
    var startTime = new Date(); 
    var openWindows = obj.driver.window_handles.length; 
    while((new Date() - startTime) < timer) { 
    openWindows = openWindows; 
    if(openWindows !== currentWindows) { 
     return true; 
    } else { 
     setTimeout(function() { 

     }, 1) 
    } 
    return false; 
    } 
}