我是casperjs的新手,据我所知,到目前为止,只有两种点击方法可以触发鼠标操作:
click()
需要选择器clickLabel()
要求"标签"标签之间我正在处理的网站现在有动态"标签",点击每个标签,触发javascript提交,没有" class"," id& #34;或"标签"与每个标签相关联,除了" pic"元素:
<a href="javascript:submitTab('search6')" tabindex="6">
<img src="image6off.gif" name="imag6" height="6" hspace="0" vspace="0" border="0" onmouseover="nbGroup('over','imag6','image6on.gif','image6on.gif',1);" onmouseout="nbGroup('out');" onclick="nbGroup('down','group1','imag6','image6off.gif',1); submitTab('search6')" alt="New Search">
</a>
我尝试使用clickLabel()
但失败了。
是的,我可以使用XPath,但问题是选项卡的数量是动态的,具体取决于每条记录的可用信息,所以在这种情况下&#34; new search&#34;可以是此记录的标签6,但另一个标签4,另一个标签8。
是的,我可以尝试写一个&#34;循环&#34;但是,如果有一种组合
的点击方法,则可能会循环显示所有可用的标签waitForResource()
那会很棒,因为我可以使用&#34; image6on.gif&#34;告诉程序要点击哪个图像或标签,显然,对于这个网站,我发现每个不同的javascript提交标签程序都与一个&#34;图像#on / off.gif&#34;
唯一关联。我希望casperjs的一些贡献者能够轻松地实现这种方法来处理这种情况。
答案 0 :(得分:3)
不完全确定这是否是您想要的,但您可以根据tabindex
属性获取标签:
casper.click("a[tabindex='6']");
编辑:Hack我根据您的评论汇总在一起:
casper.thenEvaluate(function() {
var attr = document.querySelector('img[alt="New Search"]').parentNode.getAttribute('tabindex');
__utils__.click('a[tabindex="' + attr + '"]');
});
casper.thenEvaluate()
允许您在远程页面上执行javascript。
__utils__
被注入到每个页面中,作为您可以使用的一组额外函数加载。
答案 1 :(得分:2)
我不是CasperJS的撰稿人。从我的角度来看,clickLabel
功能已经太多了。我不记得我实际上使用过它,因为大多数时候都会出现阻止精确字符串匹配的事情。
你是对的,向CasperJS添加新的点击功能是一个有效的参数。在我看来,最好使用提供的XPath功能来做到这一点。您甚至可以创建供您使用的功能:
casper.clickByImg = function(imgRes){
var x = require('casper').selectXPath;
this.click(x("//a/img[contains(@href,"+imgRes+")]/.."));
return this;
};
参见:最小开销。
你甚至可以通过正则表达式将图像与更高的开销相匹配。
casper.clickByImgRegexp = function(regexp){
var hrefs = this.getElementsAttribute("a > img", "href");
for(var i = 0; i < hrefs.length; i++) {
if (hrefs[i].match(regexp)) {
this.clickByImg(hrefs[i]);
break;
}
}
return this;
};