量角器 - 有时包括窗口处理的测试用例在"no such window"上失败



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

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

我试图在操作之前和之后添加更多的等待睡眠,但这并不能使我的测试用例稳定。

错误:

[31m致命错误:11:03:56.527 警告 - 引发异常 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);
    });

您可以等待打开的窗口数量发生任何变化。然后才尝试将命令发送到当前窗口。

这里有一个小函数,它可以捕获窗口编号的任何变化并相应地返回 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
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;
  }
}

相关内容

最新更新