单击一个按钮,直到它在 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
是异步的。请给我一些如何执行此操作的示例?
页面没有一次加载所有数据。必须单击 'Older Shares' 按钮,直到出现数据。这可能会发生很多次,具体取决于数据量。所以,我需要在捕获数据之前根据需要经常点击。
首先,您不能像现在这样使用 clickOldShares
进行任何操作。 casper.evaluate()
提供对 DOM 的访问,但传入的函数被沙盒化并在页面上下文中执行。所有数据都必须显式传入和传出,并且必须是原始数据。 DOM 元素不是原始元素,不能从页面上下文中传递出去(this.evaluate(clickOldShares)
将始终 return 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()
我有这个代码示例:
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
是异步的。请给我一些如何执行此操作的示例?
页面没有一次加载所有数据。必须单击 'Older Shares' 按钮,直到出现数据。这可能会发生很多次,具体取决于数据量。所以,我需要在捕获数据之前根据需要经常点击。
首先,您不能像现在这样使用 clickOldShares
进行任何操作。 casper.evaluate()
提供对 DOM 的访问,但传入的函数被沙盒化并在页面上下文中执行。所有数据都必须显式传入和传出,并且必须是原始数据。 DOM 元素不是原始元素,不能从页面上下文中传递出去(this.evaluate(clickOldShares)
将始终 return 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()