casperjs,可能需要另一个点击方法?

时间:2013-08-14 23:26:51

标签: javascript html tabs click casperjs

我是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的一些贡献者能够轻松地实现这种方法来处理这种情况。

2 个答案:

答案 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;
};