量角器 - 有时包含窗口处理的测试用例在“没有这样的窗口”时失败

时间:2016-06-08 11:12:47

标签: node.js selenium-webdriver automation jasmine protractor

因为我已将我的脚本集成到Jenkins,

有时我的部分测试用例包含switchTo().window(handles[0])失败。

我尝试在操作之前和之后添加更多等待睡眠但它不会使我的测试用例稳定。

错误:

  

[31mFatal error:11:03:56.527 WARN - 抛出异常       org.openqa.selenium.NoSuchWindowException:没有这样的窗口

测试用例例如:

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);
    });

2 个答案:

答案 0 :(得分:0)

您可以等待打开的窗口编号的任何更改。然后才尝试将命令发送到当前窗口。

这是一个很小的函数,可以捕获窗口号的任何变化并相应地返回True / False:

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

答案 1 :(得分: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;
  }
}