2013-11-26 6 views
5

मुझे किसी डोम में सभी जावास्क्रिप्ट आधारित लिंक पर क्लिक करने और आउटपुट को सहेजने में समस्या हो रही है। लिंक निम्न फ़ॉर्म मेंकैस्परजेएस में सभी लिंक का पालन कैसे करें?

<a id="html" href="javascript:void(0);" onclick="goToHtml();">HTML</a> 

निम्नलिखित कोड महान काम करता है:

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

var fs = require('fs'); 

var firstUrl = 'http://www.testurl.com/test.html'; 

var css_selector = '#jan_html'; 

casper.start(firstUrl); 

casper.thenClick(css_selector, function(){ 
    console.log("whoop"); 
}); 

casper.waitFor(function check() { 
    return this.getCurrentUrl() != firstUrl; 
}, function then() { 
    console.log(this.getCurrentUrl()); 
    var file_title = this.getTitle().split(' ').join('_') + '.html'; 
    fs.write(file_title, this.getPageContent()); 
}); 

casper.run(); 

हालांकि, मैं कैसे प्राप्त कर सकते हैं इस, "एक" का एक चयनकर्ता के साथ काम करने के लिए सभी उपलब्ध लिंक पर क्लिक करने और सामग्री को बचाने के ? मुझे यकीन नहीं है कि चयनकर्ता से नोड्स को हटाने के लिए क्लिक करने के लिए चयनकर्ता को कैसे प्राप्त किया जाए: Click on all links matching a selector

उत्तर

14

मेरे पास यह स्क्रिप्ट है कि पहले किसी पृष्ठ से सभी लिंक प्राप्त होंगे, फिर 'href' विशेषताओं को सरणी में सहेजें, फिर इस सरणी पर पुनरावृति जाएगा और फिर एक एक करके प्रत्येक लिंक को खोलकर उसकी यूआरएल गूंज:

var casper = require('casper').create({ 
    logLevel:"verbose", 
    debug:true 
}); 
var links; 

casper.start('http://localhost:8000'); 

casper.then(function getLinks(){ 
    links = this.evaluate(function(){ 
     var links = document.getElementsByTagName('a'); 
     links = Array.prototype.map.call(links,function(link){ 
      return link.getAttribute('href'); 
     }); 
     return links; 
    }); 
}); 
casper.then(function(){ 
    this.each(links,function(self,link){ 
     self.thenOpen(link,function(a){ 
      this.echo(this.getCurrentUrl()); 
     }); 
    }); 
}); 
casper.run(function(){ 
    this.exit(); 
}); 
+1

यह कैसे करता है, तो आप सरणी आप के माध्यम से पाशन कर रहे हैं करने के लिए लिंक जोड़ने के लिए सक्षम होना चाहते हैं पूरा किया जा सकता है क्या है? –

+0

हालांकि यह एक दिलचस्प कार्यान्वयन है जिसे कुछ [इस तरह] के साथ जोड़ा जा सकता है (https://coderwall.com/p/uzaaaw/scrape-site-for-js-errors-with-casper-js) त्रुटियों को स्कैम करने के लिए एक वेबसाइट। मुझे आश्चर्य है कि यह चीज अनंत लूप में फंस जाएगी .. –

1

rusln's answer अच्छा काम करता है, तो सभी लिंक एक सार्थक href विशेषता (वास्तविक uRL) है। यदि आप प्रत्येक a पर क्लिक करना चाहते हैं जो जावास्क्रिप्ट फ़ंक्शन को ट्रिगर करता है, तो आपको तत्वों पर किसी अन्य तरीके को फिर से शुरू करने की आवश्यकता हो सकती है।

मैं XPath generator from stijn de ryck for an element का उपयोग करने का प्रस्ताव करता हूं।

  1. फिर आप पृष्ठ पर मौजूद सभी XPaths का नमूना दे सकते हैं।
  2. फिर आप प्रत्येक a के लिए पृष्ठ खोलें कि आपके पास XPath है और इसे XPath द्वारा क्लिक करें।
  3. एक छोटे से प्रतीक्षा करता है, तो यह एक ही पृष्ठ आवेदन
  4. कुछ
var startURL = 'http://localhost:8000', 
    xPaths 
    x = require('casper').selectXPath; 

casper.start(startURL); 

casper.then(function getLinks(){ 
    xPaths = this.evaluate(function(){ 
     // copied from https://stackoverflow.com/a/5178132/1816580 
     function createXPathFromElement(elm) { 
      var allNodes = document.getElementsByTagName('*'); 
      for (var segs = []; elm && elm.nodeType == 1; elm = elm.parentNode) { 
       if (elm.hasAttribute('id')) { 
         var uniqueIdCount = 0; 
         for (var n=0;n < allNodes.length;n++) { 
          if (allNodes[n].hasAttribute('id') && allNodes[n].id == elm.id) uniqueIdCount++; 
          if (uniqueIdCount > 1) break; 
         }; 
         if (uniqueIdCount == 1) { 
          segs.unshift('id("' + elm.getAttribute('id') + '")'); 
          return segs.join('/'); 
         } else { 
          segs.unshift(elm.localName.toLowerCase() + '[@id="' + elm.getAttribute('id') + '"]'); 
         } 
       } else if (elm.hasAttribute('class')) { 
        segs.unshift(elm.localName.toLowerCase() + '[@class="' + elm.getAttribute('class') + '"]'); 
       } else { 
        for (i = 1, sib = elm.previousSibling; sib; sib = sib.previousSibling) { 
         if (sib.localName == elm.localName) i++; }; 
         segs.unshift(elm.localName.toLowerCase() + '[' + i + ']'); 
       }; 
      }; 
      return segs.length ? '/' + segs.join('/') : null; 
     }; 
     var links = document.getElementsByTagName('a'); 
     var xPaths = Array.prototype.map.call(links, createXPathFromElement); 
     return xPaths; 
    }); 
}); 
casper.then(function(){ 
    this.each(xPaths, function(self, xpath){ 
     self.thenOpen(startURL); 
     self.thenClick(x(xpath)); 
     // waiting some time may be necessary for single page applications 
     self.wait(1000); 
     self.then(function(a){ 
      // do something meaningful here 
      this.echo(this.getCurrentUrl()); 
     }); 

     // Uncomment the following line in case each click opens a new page instead of staying at the same page 
     //self.back() 
    }); 
}); 
casper.run(function(){ 
    this.exit(); 
}); 
संबंधित मुद्दे