繁体   English   中英

单击一个按钮,直到它在CasperJS中消失

[英]Click on a button until it disappears in CasperJS

我有我的代码示例:

function clickOldShares() {
  console.log("Waiting for all shares");
  element = document.querySelector("#pagelet_scrolling_pager > div > div > a"); 
  return element;
 }      

  casper.thenOpen("https://www.facebook.com/shares/view?id=" + fb_objectID,function(){
    console.log("Open post with object-id");
  });

  casper.then(function(){
    element = this.evaluate(clickOldShares);
  });


  casper.wait(2000,function() {
    console.log('ELEMENT1: ' + element);
    element = this.evaluate(clickOldShares);

  });

  casper.wait(2000,function() {
    newelement = this.evaluate(clickOldShares);  
    console.log('ELEMENT2: ' + newelement);
  });

  casper.wait(2000,function() {
    newelement = this.evaluate(clickOldShares);  
    console.log('ELEMENT3: ' + newelement);

  });

我不明白如何使用CasperJS在循环中将此调用转换为clickOldShares ,因为casper.wait是异步的。 我可以举一些如何做到这一点的例子吗?

该页面不会一次加载所有数据。 有必要单击“旧股”按钮,直到数据出现。 这可能会发生很多次,具体取决于数据量。 因此,我需要在捕获数据之前根据需要经常单击。

首先,你不能像现在这样使用clickOldShares casper.evaluate()提供对DOM的访问,但传入的函数是沙箱并在页面上下文中执行。 必须明确地传入和传出所有数据,这必须是原始的。 DOM元素不是原始元素,不能传递出页面上下文( this.evaluate(clickOldShares)将始终返回null )。 您将需要调用页面上下文中的单击代码。


您可以等待一个元素与waitForSelector一起出现。 你真的不需要迭代等待它。

var selector = "#pagelet_scrolling_pager > div > div > a";
casper.start()
    .thenOpen(url)
    .waitForSelector(selector, null, null, 15000); // max 15 seconds
    .then(function(){
        this.capture("screen1.png");
        this.click(selector);
    })
    .then(function(){
        this.capture("screen2.png");
    })
    .run();

waitForSelector的第三个参数是达到超时的回调,但找不到该元素。 第四个参数是自定义超时。 默认超时设置为10秒。


看来你需要点击某个选择器直到它消失。 你不能使用循环,因为这些函数是异步的。 你将不得不使用这样的递归:

var selector = "#pagelet_scrolling_pager > div > div > a";
var i = 0;
function step() {
    if (this.exists(selector)) {
        this.capture("screen"+(i++)+".png");
        this.click(selector);
        this.wait(2000, step);
    } else {
        this.capture("screen_final.png");
    }
}

casper.start()
    .thenOpen(url)
    .then(step)
    .then(function(){
        // TODO: do something else
    })
    .run()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM