2014-07-22 8 views
7

में एक नया टैब कैसे खोलें मैं लगभग एक महीने से कुछ टेस्ट सूट बनाने के लिए कैस्परजेएस परीक्षण ढांचे का उपयोग कर रहा हूं, लेकिन मुझे उनमें से एक में समस्या का सामना करना पड़ रहा है।CasperJS

यहां मैं यह करना चाहता हूं: मैं एक यूआरएल (पेज 1) ब्राउज़ कर रहा हूं और मुझे पहले एक को छोड़ दिए बिना एक और यूआरएल (हमारे ग्राफिक्स ब्राउज़र पर एक नया टैब अनुकरण करें) से एक और कार्रवाई करना है (पृष्ठ 1)। दूसरे यूआरएल की कार्रवाई मेरे पहले को बदलने जा रही है। उम्मीद है कि यह काफी स्पष्ट है :)

तो अब जब मैं यह देखने के लिए कदम उठाता हूं कि मेरे पहले यूआरएल पर मैं thenOpen() कर दूसरा खाता खोलता हूं, तो यह एक नया नेविगेशन कदम बना रहा है और मैं वर्तमान सत्र खो रहा हूं और मैं इस पर वापस नहीं आ सकता। मैं इतिहास का उपयोग करने, कैस्परजेएस की घटना का उपयोग करके पृष्ठ को दोबारा खोलने का प्रयास करता हूं और साथ ही मैं फैंटॉमजेएस के साथ प्रयास करता हूं लेकिन सफलता के बिना।

यहाँ यह स्पष्ट करने के कुछ छद्म कोड है:

casper.test.begin("A random test suite", 0, function testSuite(test) { 
    casper.start(url1, function() { 
     casper.then(function() { 
      // do some action on the first url 
     }); 

     casper.then(function() { 
      // open url2 and do some action in a new tab to not lose the session of url1 
     }); 

     casper.then(function() { 
      // check url1 (who should be still open) 
     }); 
    }); 

    casper.run(function() { 
     test.done(); 
    }); 
}); 

मैं वास्तव में CasperJS उपयोग करने के लिए है कि क्या करना चाहते हैं, लेकिन मैं यह संभव नहीं है सोचना शुरू, और मैं अलग अलग समाधान में देखने के लिए शुरू कर रहा हूँ जैसे कि इस पोस्ट: CasperJS, parallel browsing WITH the testing framework। लेकिन मैंने पहले कभी नोड.जेएस का उपयोग नहीं किया है, इसलिए अगर यह एकमात्र तरीका है तो कृपया मुझे कुछ उदाहरण दिखाएं।

+0

संभावित डुप्लिकेट [दो इंटरैक्टिंग ब्राउज़र (जैसे चैट ऐप) का परीक्षण कैसे करें] (http://stackoverflow.com/questions/24315512/how-to-test-two-interacting-browsers-eg-chat-app) –

उत्तर

10

आम तौर पर, यह संभव नहीं है क्योंकि एक कैस्पर स्क्रिप्ट केवल एक प्रेतोज़ रनटाइम के अंदर चलती है। आपके मामले में यह संभव लगता है।

नोट: क्योंकि यह एक दूसरे कैस्पर उदाहरण पर निर्भर करता है, यह एक कैस्पर परीक्षण वातावरण में नहीं किया जा सकता।

आप बाहरी कैस्पर उदाहरण (casper1) के एक चरण के अंदर एक नया कैस्पर उदाहरण (casper2) बना सकते हैं।उदाहरण के पूरा होने की प्रतीक्षा के लिए आपको casper1 को निर्देश देना होगा, क्योंकि कैस्पर प्रकृति में असीमित है। ध्यान रखें कि यह बिल्कुल एक नए टैब की तरह है, इसलिए उदाहरण कैश, कुकीज़ और संग्रहण साझा करेंगे।

var casper1 = require('casper').create(); 
var casper2done = false; 

casper1.start("http://www.example.com").then(function(){ 
    casper1.capture("casper1_1.png"); 
    var casper2 = require('casper').create(); 
    casper2.start("http://stackoverflow.com/contact").then(function(){ 
     casper1.echo(casper2.getCurrentUrl(), casper2.getTitle()); 
     casper2.capture("casper2.png"); 
    }).run(function(){ 
     this.echo("DONE 2"); 
     casper2done = true; 
    }); 
}).waitFor(function check(){ 
    return casper2done; 
}).then(function(){ 
    casper1.echo(casper1.getCurrentUrl(), casper1.getTitle()); // Comment to fix answer (min 6 chars) 
    casper1.capture("casper1_2.png"); 
}).run(function(){ 
    this.echo("DONE"); 
    this.exit(); 
}); 

यहाँ मैं वादा श्रृंखलन/बिल्डर पैटर्न का उपयोग करें:

यहाँ एक नमूना स्क्रिप्ट है। तुम भी जटिलता छिपाने के लिए और इसे बार-बार प्रयोग करने योग्य बनाने के लिए अपने स्वयं के समारोह बना सकते हैं:

var casper = require('casper').create(); 

// IIFE to hide casper2done variable 
(function(casper){ 
    var casper2done = false; 
    casper.newTab = function(url, then, timeout){ 
     if (typeof url !== "string" || typeof then !== "function") { 
      throw "URL or then callback are missing"; 
     } 
     this.then(function(){ 
      var casper2 = require('casper').create(); 
      casper2.start(url).then(then).run(function(){ 
       casper2done = true; 
      }); 
     }).waitFor(function check(){ 
      return casper2done; 
     }, null, null, timeout).then(function(){ 
      casper2done = false; 
     }); 
     return this; 
    }; 
})(casper); 

casper.start("http://www.example.com").newTab("http://stackoverflow.com/contact", function(){ 
    // this is casper2 
    this.echo(this.getCurrentUrl(), this.getTitle()); 
    this.capture("casper2_1.png"); 
    this.thenClick("a#nav-askquestion"); 
    this.then(function(){ 
     this.echo(this.getCurrentUrl(), this.getTitle()); 
     this.capture("casper2_2.png"); 
    }); 
}, 15000).then(function(){ 
    // this is casper 
    this.echo(casper.getCurrentUrl(), casper.getTitle()); 
    this.capture("casper1.png"); 
}).run(function(){ 
    this.echo("DONE"); 
    this.exit(); 
}); 

आप अपने बच्चे कैस्पर उदाहरण के अनेक चरणों का उपयोग कर सकते हैं, लेकिन भूल नहीं है एक अच्छा समय समाप्ति निर्दिष्ट करने के लिए।

+0

हम कैस्परजेस परीक्षा उपसमंद का उपयोग करके ऐसा कैसे कर सकते हैं? क्योंकि हम परीक्षण वातावरण में पूर्व-कॉन्फ़िगर किए गए कैस्पर उदाहरण को ओवरराइड नहीं कर सकते हैं। – TuZ

+0

यह संभव नहीं होगा। फिर, आपको [child_process] (https://github.com/ariya/phantomjs/wiki/Api-reference-childprocess) मॉड्यूल के माध्यम से एक बच्चे को जन्म देना होगा। इसे मूल्यांकन कॉल की तरह लिखना संभव हो सकता है जिसे सैंडबॉक्स किया जाएगा। –

संबंधित मुद्दे