2

我是 casperjs 的新手,据我所知,目前只有两种点击方法可以触发鼠标操作:

  • click()需要一个选择器
  • clickLabel()标签之间需要“标签”

我现在处理的网站有动态的“标签”,通过点击每个标签,一个javascript提交被触发,除了“pic”元素之外,没有与每个标签关联的“class”、“id”或“label” :

<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,但问题是选项卡的数量是动态的,具体取决于每条记录的可用信息,因此在这种情况下,“新搜索”可能是该记录的选项卡 6,但另一个选项卡是选项卡 4,选项卡 8 在完后还有。

是的,我可以尝试编写一个“循环”来遍历所有可用的选项卡,但是,如果有一种单击方法可以结合

waitForResource()

那太好了,因为我可以使用“image6on.gif”来告诉程序要单击哪个图像或选项卡,显然,对于这个网站,我发现每个不同的 javascript 提交选项卡程序都与一个“图像#”唯一相关联开/关.gif"

我希望 casperjs 的一些贡献者可以轻松地实现这种方法来处理这种情况。

4

2 回答 2

3

不完全确定这是否是您想要的,但您可以根据以下tabindex属性获取选项卡:

casper.click("a[tabindex='6']");

编辑:我根据您在下面的评论拼凑起来的哈克:

casper.thenEvaluate(function() {
  var attr = document.querySelector('img[alt="New Search"]').parentNode.getAttribute('tabindex');
  __utils__.click('a[tabindex="' + attr + '"]');
});

casper.thenEvaluate()允许您在远程页面上执行 javascript。

__utils__被注入到作为您可以使用的一组额外功能加载的每个页面中。

于 2013-08-15T00:58:22.733 回答
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;
};
于 2014-06-15T13:47:17.317 回答