2015-02-16 2 views
4

Я довольно новичок в транспортировке. Я пытаюсь автоматизировать сценарий, когда я нажимаю кнопку, и открывает страницу на новой вкладке, а затем нам нужно заполнить форму на новой странице и отправить.Кнопка транспортира Нажмите и откройте страницу на новой вкладке

выпуск: когда я нажимаю на кнопку, чтобы открыть новую страницу. Мои тесты не ждут загрузки новой страницы и говорят, что завершено тестирование и успешное сообщение.

Я использую простое нажатие этой кнопки, чтобы нажать кнопку.

element(by.id("newPlan")).click()

Я что-то упустил? Нужно ли мне что-то делать, чтобы мои тесты дождались загрузки новой страницы, а затем я могу выполнить некоторые функции?

ответ

16

Вам нужно подождать, пока страница не откроется, используя обратные вызовы. Попробуйте что-то в этом смысле:

element(by.id("newPlan")).click().then(function() { 
     browser.getAllWindowHandles().then(function (handles) { 
      newWindowHandle = handles[1]; // this is your new window 
      browser.switchTo().window(newWindowHandle).then(function() { 
       // fill in the form here 
       expect(browser.getCurrentUrl()).toMatch(/\/url/); 
      }); 
     }); 
    }); 
+0

Я попытался это, но получил ошибку UnknownError: неизвестная ошибка: «имя» должно быть непустой строкой – Sumit

+0

Попробуйте выполнить печать из ручки параметров, чтобы увидеть, если окно, которое вы ищете там. –

+0

Вы делаете что-нибудь на порожденной странице? Убедитесь, что страница также является угловой js-страницей. –

0

Есть еще один удобный способ. Просто используйте функции на объекте browser.

element(by.id("newPlan")).click(); 
browser.sleep(10000); 
browser.waitForAngular(); 
expect(browser.getCurrentUrl()).toMatch(/\/url/) 
+1

Я не хотел использовать функции сна, поскольку они вызывают проблемы на медленных серверах и не нужны на быстрых серверах. – Sumit

+0

Правда. Поскольку 'waitForAngular' не всегда ждет, как ожидалось, мы должны добавить' sleep', чтобы убедиться, что есть достаточное ожидание. Конечно, это слишком произвольно и может привести к ненужной задержке. Но если мы просто начнем тест и позволим ему работать (возможно, после рабочего времени), компромисс может быть приемлемым. – Blaise

1

«Убедившись, что новая страница также AngularJS страница» не делает слишком много смысла для меня, если я честно :)

Тест должен быть действительным независимо от тип страницы/приложения, на который перенаправляется браузер, не так ли?

Если вы столкнулись с проблемами с доступом к новой вкладке URL на не угловом странице, попробуйте

browser.driver.getCurrentUrl() 

вместо

browser.getCurrentUrl() 
2

Это решение, которое работало для меня, но я добавлен браузер.sleep (500), чтобы избежать упомянутой выше ошибки (UnknownError: неизвестная ошибка: «имя» должно быть непустой строкой). Проблема заключалась в том, что новый дескриптор еще не был доступен. Просто дайте ему мгновение после щелчка, чтобы открыть новую вкладку и получить доступ к ней. Да, это добавление уродливого сна, но это короткий ...

element(by.id("newPlan")).click().then(function() { 
     browser.sleep(500); 
     browser.getAllWindowHandles().then(function (handles) { 
      newWindowHandle = handles[1]; // this is your new window 
      browser.switchTo().window(newWindowHandle).then(function() { 
       // fill in the form here 
       expect(browser.getCurrentUrl()).toMatch(/\/url/); 
      }); 
     }); 
    }); 
0

Вот реализация без использования метода browser.sleep(). Функция waitForNewWindow() создана с использованием async и underscorejs. Где async.until() метод используется для звонка getAllWindowHandles() синхронно.

element(by.id("newPlan")).click() 
    .then(function() { 
     return waitForNewWindow(); 
    }) 
    .then(function (newWindowHandle) { 
     browser.switchTo().window(newWindowHandle).then(function() { 
      expect(browser.getCurrentUrl()).toMatch(/\/url/); 
     }); 
    }); 

/** 
* Wait for new window is opened 
* 
* @param {Object} [params] 
* @param {number} [params.runs] - number of tries 
* @param {number} [params.interval] - interval for launching getAllWindowHandles() 
* 
* @returns {webdriver.promise.Promise} 
*/ 
function waitForNewWindow(params) { 
    var currentHandles = []; 
    var deferred = protractor.promise.defer(); 
    var finish; 
    var newHandle; 
    var numberOfRuns = 0; 

    params = params ? params : {}; 
    params.runs = params.runs || 10; 
    params.interval = params.interval || 1000; 

    browser.driver.getAllWindowHandles() 
     .then(function (handles) { 
      currentHandles = handles; 
     }) 
     .then(function() { 
      async.until(
       // function that tests condition 
       function() { 
        return newHandle || finish; 
       }, 
       // function that is executed until test condition is true 
       function (callback) { 
        browser.driver.getAllWindowHandles() 
         .then(function (newHandles) { 
          numberOfRuns++; 

          if (numberOfRuns > params.runs) { 
           finish = true; 

           return callback(null, newHandle); 
          } 

          if (currentHandles.length < newHandles.length) { 
           newHandle = _.difference(newHandles, currentHandles); 

           return callback(null, newHandle); 
          } 

          setTimeout(function() { 
           callback(null, newHandle); 
          }, params.interval); 
         }); 
       }, 
       // callback when test condition is true 
       function (error, result) { 
        if (!result) { 
         return deferred.reject('New browser window hasn\'t been opened'); 
        } 

        if (result.length > 1) { 
         return deferred.reject('More than one new browser window were opened'); 
        } 

        deferred.fulfill(result.toString()); 
       } 
      ); 
     }); 

    return deferred.promise; 
}; 
Смежные вопросы