Click on all links matching a selector

前端 未结 3 1565
抹茶落季
抹茶落季 2020-12-19 05:22

I have a list of links that I have to simulate a click on using CasperJS. They all share the same class.

However using this.click(\'.click-me\') only cl

相关标签:
3条回答
  • 2020-12-19 05:38

    I ended up using the nth-child() selector to accomplish this. Here's how...

    Page:

    <ul id="links">
      <li><a href="#1">1</a></li>  
      <li><a href="#2">2</a></li>  
      <li><a href="#3">3</a></li>  
    </ul>
    

    Script:

    casper.then(function() {
      var i = 1;
      this.repeat(3, function() {
        this.click('#links li:nth-child(' + i + ') a');
        i++;
      });
    });
    

    You obviously don't have to use repeat but any iteration technique should work.

    0 讨论(0)
  • 2020-12-19 05:47

    Mixing the other responses, to avoid the infinite loop (this worked for me, as my items were consecutive inside a tag):

    casper.clickWhileSelector = function(selector, i) {
        return this.then(function() {
            i = i || 1;
            selectorNth = selector+':nth-child(' + i + ')';
    
            if (this.exists(selectorNth)) {
                this.echo('found link: '+this.getElementInfo(selectorNth).tag);
                this.click(selectorNth);
                return this.clickWhileSelector(selector, i+1);
            }
            return this.echo('Done.').exit();
        });
    }
    

    Hope it helps!

    Luis.

    0 讨论(0)
  • 2020-12-19 05:54

    As proposed on the CasperJS ML and for the records, here's a possible implementation of clickWhileSelector:

    var casper = require('casper').create();
    
    casper.clickWhileSelector = function(selector) {
        return this.then(function() {
            if (this.exists(selector)) {
                this.echo('found link: ' + this.getElementInfo(selector).tag);
                this.click(selector);
                return this.clickWhileSelector(selector);
            }
            return this.echo('Done.').exit();
        });
    }
    
    casper.start().then(function() {
        this.page.content =
            '<html><body>' +
            '<a href="#" onclick="this.parentNode.removeChild(this);return false;">link 1</a>' +
            '<a href="#" onclick="this.parentNode.removeChild(this);return false;">link 2</a>' +
            '<a href="#" onclick="this.parentNode.removeChild(this);return false;">link 3</a>' +
            '</body></html>';
    });
    
    casper.clickWhileSelector('a').run();
    

    That gives:

    $ casperjs c.js
    found link: <a href="#" onclick="this.parentNode.removeChild(this);return false;">link 1</a>
    found link: <a href="#" onclick="this.parentNode.removeChild(this);return false;">link 2</a>
    found link: <a href="#" onclick="this.parentNode.removeChild(this);return false;">link 3</a>
    Done.
    
    0 讨论(0)
提交回复
热议问题