【问题标题】:CasperJS - how to treat an 'click' inside an loop?CasperJS - 如何处理循环内的“点击”?
【发布时间】:2016-05-06 21:07:32
【问题描述】:

在评估函数内的循环内“单击”后,我无法处理事情。我不知道另一种治疗方法。

“乐”代码...

links = this.evaluate(function(){
      story_boxes = __utils__.getElementsByXPath('//div[@id="contentCol"]//div[@id="stream_pagelet"]/div[contains(@id,"topnews_main_stream")]/div/div//div[contains(@data-ft,"{")]');

      for(x=0;x<=story_boxes.length;x++){
        story_box = story_boxes[x];
        boxID = story_box.getAttribute('id');

        //Is this feed a sponsored?
        sponsored = story_box.querySelector('a.uiStreamSponsoredLink');
        if(sponsored){
          console.log("SPONSORED? " + sponsored   );
          try{
            elink = story_box.querySelector('div > div > div > div > div > div > a');
          }
          catch(e){
            console.log("Ooops! An error occured, sorry! " + e);
          }

          if(elink){
            console.log("FOUND IT!");
            crap = setTimeout( function(){
              elink.click(); //where can I treat this?
            }, 1000);

            break;
          }
          else {
            console.log("NO DONUT FOR YOU!");
          }
          console.log("\n\n#########");
        }
      }
      console.log("#####");

    });
    //... more irrelevant things

问题是如何处理每次点击?我只需要点击结果的子树。我不知道我在这里是否清楚。应该不会吧……:P

【问题讨论】:

    标签: javascript loops for-loop click casperjs


    【解决方案1】:

    我怀疑您在问如何处理点击结果。

    如果点击导致新页面加载,那么您只需在代码后添加一个等待步骤,让 CasperJS 处理页面的加载:

    casper.then(function(){
        var success = this.evaluate(function(){
            ...
            if(elink){
                console.log("FOUND IT!");
                crap = setTimeout( function(){
                    elink.click(); //where can I treat this?
                }, 1000);
    
                return true;
            }
            ...
            return false;
        });
    
        if (success) {
            this.wait(1100, function(){
                // TODO: do something with the loaded page
            })
        } else {
            // TODO: do something on fail
        }
    })
    

    如果点击改变了现有页面,那么你需要等待这样的改变。 CasperJS 为这种情况提供了很多功能。它们都以wait 开头。例如:

    casper.then(function(){
        this.evaluate(...);
    }).wait(1100).waitForSelector('some new element selector', function _then(){
        // TODO: do something with the loaded page
    }, function _onTimeout(){
        // TODO: do something on fail
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-05
      • 2019-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-24
      • 2016-10-25
      相关资源
      最近更新 更多