【问题标题】:casperjs, might need another click method?casperjs,可能需要另一种点击方法?
【发布时间】:2013-08-14 23:26:50
【问题描述】:

我是casperjs新手,据我目前了解到的,只有两种点击方法可以触发鼠标动作:

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

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

<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 提交选项卡程序都与一个唯一相关联“图像#on/off.gif”

希望 casperjs 的一些贡献者能够轻松实现这种方法来处理这种情况。

【问题讨论】:

  • 对了,如果有其他方法可以绕过,请教教我,具体来说,如何点击标签号与后面的记录字段没有关联的特定标签,但我想要特定的记录字段而不是 No.# 选项卡的信息,我希望我足够具体
  • 非常感谢您的编辑工作,rgettman

标签: javascript html tabs click casperjs


【解决方案1】:

不完全确定这是否是您想要的,但您可以根据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__ 被注入到每个加载的页面中,作为一组额外的函数供您使用。

【讨论】:

  • 首先,非常感谢您的回答,“tabindex="6”不一定总是和“新搜索”相关联,每个标签都有不同的信息,如果我想点击“新搜索”,此记录的“新搜索”选项卡可能是 tabindex="6" 但下一个记录的 tabindex="8",所以我不能使用 tabindex 来确保我将始终单击“新搜索”,一个我发现与选项卡“image#on/off.gif”关联的图像与内容唯一关联,例如“新搜索”,因此,如果我可以指定我正在单击的资源,那么问题就来了会解决的!
  • 已更新,以便它抓取图像父级的 tabindex,然后单击该元素。
  • 我的天,这么多天才都在这里,似乎没有什么是不可实现的,非常感谢你,hexid
  • 当然,为什么不呢,我学到了一些新东西,我太老了,但我必须学习java
【解决方案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;
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多