हम पृष्ठ वस्तु पैटर्न उपयोग कर रहे हैं हमारी आंतरिक AngularJS आवेदन टेस्ट का आयोजन करने के लिए। जब यह एक करने के लिए आता है,एकाधिक ब्राउज़र और पृष्ठ वस्तु पैटर्न
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
});
});
लेकिन:,
var LoginPage = function() {
this.username = element(by.id("username"));
this.password = element(by.id("password"));
this.loginButton = element(by.id("submit"));
}
module.exports = LoginPage;
एक एकल ब्राउज़र परीक्षण में यह काफी स्पष्ट है कि यह कैसे उपयोग करने के लिए:
यहाँ एक उदाहरण पेज वस्तु हमारे पास है परीक्षण करें जब एकाधिक ब्राउज़र तत्काल होते हैं और एक परीक्षण में उनके बीच स्विच करने की आवश्यकता होती है, यह स्पष्ट हो रहा है कि एक ही पेज ऑब्जेक्ट का उपयोग एकाधिक ब्राउज़रों के साथ कैसे किया जाए:
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"
});
});
समस्या:
हम एक नई ब्राउज़र काँटेदार के बाद, कैसे हम एक ही पृष्ठ वस्तु क्षेत्रों और कार्यों का उपयोग कर सकते हैं, लेकिन एक नए instantiated ब्राउज़र (इस मामले में browser2
) के लिए आवेदन किया?
दूसरे शब्दों में, सभी element()
यहां कॉल browser
पर लागू होंगे, लेकिन browser2
पर लागू होने की आवश्यकता है। हम संदर्भ कैसे बदल सकते हैं?
विचार:
एक संभव यहाँ दृष्टिकोण अस्थाई रूप से
browser2
के संदर्भ में किया जा रहा है redefine the globalelement = browser2.element
होगा। इस दृष्टिकोण के साथ समस्या यह है कि पेज ऑब्जेक्ट फ़ंक्शंस के अंदर हमारे पासbrowser.wait()
कॉल भी हैं। इसका मतलब है किbrowser = browser2
भी सेट किया जाना चाहिए। इस मामले में, हम एक अस्थायी चर मेंbrowser
वैश्विक वस्तु याद है और इसे फिर से स्थापित करने के लिए एक बार हम मुख्यbrowser
संदर्भ में वापस स्विच .. पेज वस्तु में ब्राउज़र उदाहरण पारित करने के लिए की आवश्यकता होगीएक अन्य संभावित दृष्टिकोण होगा , कुछ की तरह:
var LoginPage = function (browserInstance) { browser = browserInstance ? browserInstance : browser; var element = browser.element; // ... }
लेकिन यह शायद हर पृष्ठ वस्तु हमारे पास बदलने के लिए की आवश्यकता होगी ..
आशा है कि सवाल स्पष्ट है - मुझे तो हमें बताएं इसे स्पष्टीकरण की आवश्यकता है।
मैं अपने पृष्ठ वस्तु वर्ग उदाहरण के लिए अपने ड्राइवर सत्र गुजर तुलना में एक अधिक चालाक रास्ता नहीं सोच सकते हैं ... कि एक ही रास्ता मैं देख रहा हूँ आप अपने खुद के पैर के अंगूठे में कदम नहीं जब अनन्य कार्य के साथ काम कर देख सकते हैं एक ही परीक्षण में कई ब्राउज़र सत्रों में ... – Bodao
@ user3087106 धन्यवाद, हमने वास्तव में इस दृष्टिकोण का उपयोग करना शुरू कर दिया है ... लेकिन यह सिर्फ 'ब्राउज़र इंस्टेंस' तर्क और प्रत्येक पृष्ठ ऑब्जेक्ट में दो पंक्तियों के साथ सुंदर और साफ दिखता नहीं है ऑब्जेक्ट हमारे पास है, मुझे लगता है कि हमें मूल पृष्ठ ऑब्जेक्ट "क्लास" होना चाहिए और DRY सिद्धांत का उल्लंघन करने से बचने के लिए 'प्रोटोटाइप' का उपयोग करना होगा .. – alecxe
मैंने इसे निम्न स्तर की भाषाओं जैसे सी # और न्यूटिट, जावा और जुनीट, पायथन में किया है लेकिन मुझे शक है कि यह आपकी मदद करेगा। – Margus