Мы используем шаблон объекта страницы для организации наших внутренних тестов приложений AngularJS.
Вот пример страницы, который у нас есть:
var LoginPage = function () {
this.username = element(by.id("username"));
this.password = element(by.id("password"));
this.loginButton = element(by.id("submit"));
}
module.exports = LoginPage;
В однобуквенном тесте совершенно ясно, как его использовать:
var LoginPage = require("./../po/login.po.js");
describe("Login functionality", function () {
var scope = {};
beforeEach(function () {
browser.get("/#login");
scope.page = new LoginPage();
});
it("should successfully log in a user", function () {
scope.page.username.clear();
scope.page.username.sendKeys(login);
scope.page.password.sendKeys(password);
scope.page.loginButton.click();
// assert we are logged in
});
});
Но, когда дело доходит до теста при создании нескольких браузеров и возникает необходимость переключаться между ними в одном тесте, становится неясным, как использовать один и тот же объект страницы с несколькими браузерами:
describe("Login functionality", function () {
var scope = {};
beforeEach(function () {
browser.get("/#login");
scope.page = new LoginPage();
});
it("should warn there is an opened session", function () {
scope.page.username.clear();
scope.page.username.sendKeys(login);
scope.page.password.sendKeys(password);
scope.page.loginButton.click();
// assert we are logged in
// fire up a different browser and log in
var browser2 = browser.forkNewDriverInstance();
// the problem is here - scope.page.username.clear() would be applied to the main "browser"
});
});
Проблема:
После того, как мы разветкили новый браузер, как мы можем использовать те же поля и функции объекта страницы, но применимы к недавно созданному браузеру (browser2
в этом случае)?
Другими словами, все вызовы element()
здесь будут применены к browser
, но должны быть применены к browser2
. Как мы можем переключить контекст?
Мысли:
-
одним из возможных подходов здесь будет переопределить глобальный
element = browser2.element
временно, находясь в контекстеbrowser2
. Проблема с этим подходом заключается в том, что мы также имеемbrowser.wait()
вызовы внутри функций объекта страницы. Это означает, чтоbrowser = browser2
также должен быть установлен. В этом случае нам нужно будет запомнить глобальный объектbrowser
в переменной temp и восстановить его, как только мы вернемся к основному контекстуbrowser
. -
другой возможный подход состоял бы в том, чтобы передать экземпляр браузера в объект страницы, например:
var LoginPage = function (browserInstance) { browser = browserInstance ? browserInstance : browser; var element = browser.element; // ... }
но это, вероятно, потребует изменить каждый объект страницы, который у нас есть.
Надеюсь, что вопрос ясен - дайте мне знать, если ему нужно уточнение.