CasperJS:你如何点击所有选定的按钮?
CasperJS: How do you click on all selected buttons?
我正在尝试将 CasperJS 用作网络抓取工具,并且有一个带有按钮的页面,单击时会加载数据。所以,我想先点击所有这些按钮,然后等待,然后再实际进行查询以获取所有必要的数据。
问题是使用 Casper,casper.thenClick(selector)
单击第一个元素。但是如何根据选择器迭代点击每个元素呢?
请注意,这些按钮没有 ID。它们都有通用的 class 选择器。
例如
<h3>
<span>Text 1</span>
<span>
<button class="load-btn">show</button>
</span>
</h3>
<h3>
<span>Text 2</span>
<span>
<button class="load-btn">show</button>
</span>
</h3>
<h3>
<span>Text 3</span>
<span>
<button class="load-btn">show</button>
</span>
</h3>
并且出于某种原因 casper.thenClick("h3:contains('text 1') .load-btn")
不起作用。
我创建了一个新的'click'函数,您可以使用for
循环点击每个元素:
function click(sel){var event=document.createEvent('MouseEvents');event.initMouseEvent('click',1,1,window,1,0,0,0,0,0,0,0,0,0,null);sel.dispatchEvent(event);}
var casper = require('casper').create({
verbose: true,
logLevel: 'debug',
waitTimeout: 5000,
userAgent: 'Mozilla/5.0 (X11; Linux x86_64; rv:49.0) Gecko/20100101 Firefox/49.0',
viewportSize:{width: 1600, height: 900}
});
casper
.on("error", function(msg){ this.echo("error: " + msg, "ERROR") })
.on("page.error", function(msg, trace){ this.echo("Page Error: " + msg, "ERROR") })
.on("remote.message", function(msg){ this.echo("Info: " + msg, "INFO") })
.start("http://domu-test-2/node/12", function(){
this.evaluate(function(click){
var i, x = document.querySelectorAll("button.load-btn");
for(i = 0; i < x.length; i++) {
click(x[i]);
} //'click' for each element
}, click);
})
.run();
有了这个HTML:
<h3>
<span>Text 1</span>
<span>
<button class="load-btn" onclick='console.log("1")'>show</button>
</span>
</h3>
<h3>
<span>Text 2</span>
<span>
<button class="load-btn" onclick='console.log("2")'>show</button>
</span>
</h3>
<h3>
<span>Text 3</span>
<span>
<button class="load-btn" onclick='console.log("3")'>show</button>
</span>
</h3>
将打印:
Info: 1
Info: 2
Info: 3
绿色。
您可以尝试使用 evaluate 进入 DOM(我假设页面上有 jquery)。
casper.thenEvaluate(function() {
$('button.load-btn').click();
});
请记住,您需要 等待 之后才会出现某些内容。
casper.wait(2000, function() {...});
或使用 waitFor function
之一
我正在尝试将 CasperJS 用作网络抓取工具,并且有一个带有按钮的页面,单击时会加载数据。所以,我想先点击所有这些按钮,然后等待,然后再实际进行查询以获取所有必要的数据。
问题是使用 Casper,casper.thenClick(selector)
单击第一个元素。但是如何根据选择器迭代点击每个元素呢?
请注意,这些按钮没有 ID。它们都有通用的 class 选择器。
例如
<h3>
<span>Text 1</span>
<span>
<button class="load-btn">show</button>
</span>
</h3>
<h3>
<span>Text 2</span>
<span>
<button class="load-btn">show</button>
</span>
</h3>
<h3>
<span>Text 3</span>
<span>
<button class="load-btn">show</button>
</span>
</h3>
并且出于某种原因 casper.thenClick("h3:contains('text 1') .load-btn")
不起作用。
我创建了一个新的'click'函数,您可以使用for
循环点击每个元素:
function click(sel){var event=document.createEvent('MouseEvents');event.initMouseEvent('click',1,1,window,1,0,0,0,0,0,0,0,0,0,null);sel.dispatchEvent(event);}
var casper = require('casper').create({
verbose: true,
logLevel: 'debug',
waitTimeout: 5000,
userAgent: 'Mozilla/5.0 (X11; Linux x86_64; rv:49.0) Gecko/20100101 Firefox/49.0',
viewportSize:{width: 1600, height: 900}
});
casper
.on("error", function(msg){ this.echo("error: " + msg, "ERROR") })
.on("page.error", function(msg, trace){ this.echo("Page Error: " + msg, "ERROR") })
.on("remote.message", function(msg){ this.echo("Info: " + msg, "INFO") })
.start("http://domu-test-2/node/12", function(){
this.evaluate(function(click){
var i, x = document.querySelectorAll("button.load-btn");
for(i = 0; i < x.length; i++) {
click(x[i]);
} //'click' for each element
}, click);
})
.run();
有了这个HTML:
<h3>
<span>Text 1</span>
<span>
<button class="load-btn" onclick='console.log("1")'>show</button>
</span>
</h3>
<h3>
<span>Text 2</span>
<span>
<button class="load-btn" onclick='console.log("2")'>show</button>
</span>
</h3>
<h3>
<span>Text 3</span>
<span>
<button class="load-btn" onclick='console.log("3")'>show</button>
</span>
</h3>
将打印:
Info: 1
Info: 2
Info: 3
绿色。
您可以尝试使用 evaluate 进入 DOM(我假设页面上有 jquery)。
casper.thenEvaluate(function() {
$('button.load-btn').click();
});
请记住,您需要 等待 之后才会出现某些内容。
casper.wait(2000, function() {...});
或使用 waitFor function
之一