【问题标题】:How to use CasperJS findOne function with two or more selectors?如何将 CasperJS findOne 函数与两个或多个选择器一起使用?
【发布时间】:2015-02-18 03:46:34
【问题描述】:

对不起.. 本文更新..

元素被认为是一个,但发现两个或更多..对不起..:)

<div class="rd_ft">
    <div id="prev_next">
        <a id="rd_prev" href="aaaa.html"></a>
    </div>
</div>

<div class="rd_ft">
    <div id="prev_next">
        <a id="rd_prev" href="bbbb.html"></a>   <--- it will select this element only
    </div>
</div>

...........

var con_prev = 
    this.evaluate(function(){ 
        return __utils__.findOne('div[class="rd_ft"] div[id="prev_next"] a[id="rd_prev"]').getAttribute('href'); 
    });

这段代码不应该工作..

当前选择数据是aaaa.html。

我想知道如何选择最后一个元素。

【问题讨论】:

  • 我不确定这个 casperjs 是什么,但 findONE 的目的不是要找到一个,而不是两个或更多吗?此外,要选择多个元素,请用逗号分隔它们,而不是空格。 space 搜索下一个元素作为前一个元素的子元素。
  • 现在,这是无效的 HTML。一个 id 应该在 DOM 中只使用一次。你确定这就是 DOM 的样子吗?
  • 是的。有些网站想写一篇文章,然后复制并粘贴文本的内容。有什么办法解决吗?

标签: javascript css-selectors casperjs


【解决方案1】:

替换这个:

findOne('div[class="rd_ft"] div[id="prev_next"] a[id="rd_prev"]')

用这个:

findOne('div[class="rd_ft"], div[id="prev_next"], a[id="rd_prev"]')

第一个版本将搜索看起来像这样的元素:

<div class="rd_ft">
    <div id="prev_next">
        <a id="rd_prev"></a>   <--- it will select this element only
    </div>
</div>

第二个版本将选择 3 个独立的元素:

<div class="rd_ft"></div>
<div id="prev_next"></div>
<a id="rd_prev"></a> 

更新

我刚刚看了你的问题,看来你可能问错了问题。

如果您想选择一个&lt;a&gt; 元素作为其他两个 div 的子元素,那么如果您的 div 有超过 1 个类,它将不起作用。您正在测试div[class="rd_ft"],它仅在 div 具有 one 类时才有效。如果您的 div 有超过 1 个类,则需要使用类选择器 . 对其进行测试,如下所示:div.rd_ft

基本上,你会想用这个:

findOne('div.rd_ft div[id="prev_next"] a[id="rd_prev"]')

【讨论】:

  • @ArtjomB。我同意,但我不确定 casperjs 的选择器支持,这就是为什么我在没有任何额外调整的情况下对 op 的问题给出了一个简单的答案。此外,我看不到他会首先将 href 属性放在 div 元素中的场景......
  • 通常它 (PhantomJS) 支持所有 CSS3 选择器,但有些东西是错误的,例如 nth-child 之类的东西,因此在这些情况下最好使用 XPath。
  • 我明白了。在那种情况下,我坚信 op 的语言障碍导致他错误地表达了他的问题。我会更新我的答案。
猜你喜欢
  • 1970-01-01
  • 2019-03-09
  • 2022-06-15
  • 1970-01-01
  • 2012-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多