【发布时间】:2015-07-14 02:08:00
【问题描述】:
我刚刚遇到了 CasperJS 的问题。
我需要计算表行数,因为有许多表包含相同的信息结构(比如说用户表) 所以我做了一些像这样的casperjs评估代码
var table_rows1 = casper.evaluate(function(it){ return jQuery("#dResult > div:nth-child("+1+") > div > div:nth-child(4) > div:nth-child("+it+") > div:nth-child(1) > span > div").length; }, it);
它是迭代器,它会增加直到达到表格元素长度。
假设我们有 3 张桌子,所以它将是 1,2,3 对于it = 1,没有问题发生,它打印出正确的table[1]行数。 但是对于接下来的 2,3,它只打印 1 作为表格行数。 怎么会变得这么诡异?
这是我的 CasperJS sn-p:
function getNumber(it){
window.__utils__.echo("it :"+it);
var query = "#dResult > div:nth-child("+1+") > div > div:nth-child(4) > div:nth-child("+it+") > div:nth-child(1) > span > div";
return jQuery(query).length;
}
var table_rows1 = casper.evaluate(getNumber, 1);
var table_rows2 = casper.evaluate(getNumber, 2);
var table_rows3 = casper.evaluate(getNumber, 3);
this.echo("table rows #1 :"+table_rows1);
this.echo("table rows #2 :"+table_rows2);
this.echo("table rows #3 :"+table_rows3);
这是我需要抓取的 html...
这是一张表,有很多这样的html标签
<div class="padd-b-rates">
<div id="showRateWSMA0511000015CL096-CL124">
<div class="bd-rate-in">
<div class="rth1"><b>Room Category </b></div>
<div class="rth2"><b>Breakfast</b></div>
<div class="rth3"><b>Total Stay</b></div>
<div class="rth4"><b>Room Status</b></div>
<div class="clear"></div>
</div>
<span id="RateWSMA0511000015CL096-CL124">
<div class="bd-rate-row">
<div class="rtd1"><span class="rmname-rsht-rate">DELUXE (NRF)</span><i></i></div>
<div class="rtd2"><span>Breakfast</span><i></i></div>
<div class="rtd3"><span><a href="javascript:sHC.ShowPrice('WSMA0511000015','WSMA140400017', 'BB','CL096-CL124');">2,174,005.00 IDR</a></span><i></i></div>
<div class="rtd4"><span class="btn-rsht-rate" onclick="sHC.jumpToPaxdetail(this);" hotelcode="WSMA0511000015" suppliercode="CL096-CL124" droomcatg="WSMA140400017-BB" roomstatus="Y" id="bookWSMA0511000015WSMA140400017-BB-CL096-CL124"><img border="0" src="/b2b/images/result-hotels/btnAV-v3.gif"></span></div>
<div class="clear"></div>
</div>
<div class="bd-rate-row">
<div class="rtd1"><span class="rmname-rsht-rate">EXECUTIVE (NRF)</span><i></i></div>
<div class="rtd2"><span>Breakfast</span><i></i></div>
<div class="rtd3"><span><a href="javascript:sHC.ShowPrice('WSMA0511000015','WSMA140400018', 'BB','CL096-CL124');">2,505,557.00 IDR</a></span><i></i></div>
<div class="rtd4"><span class="btn-rsht-rate" onclick="sHC.jumpToPaxdetail(this);" hotelcode="WSMA0511000015" suppliercode="CL096-CL124" droomcatg="WSMA140400018-BB" roomstatus="Y" id="bookWSMA0511000015WSMA140400018-BB-CL096-CL124"><img border="0" src="/b2b/images/result-hotels/btnAV-v3.gif"></span></div>
<div class="clear"></div>
</div>
<div class="bd-rate-row">
<div class="rtd1"><span class="rmname-rsht-rate">DELUXE</span><i></i></div>
<div class="rtd2"><span>Room Only</span><i></i></div>
<div class="rtd3"><span><a href="javascript:sHC.ShowPrice('WSMA0511000015','WSMA05110034', 'RO','CL096-CL124');">2,743,860.00 IDR</a></span><i></i></div>
<div class="rtd4"><span class="btn-rsht-rate" onclick="sHC.jumpToPaxdetail(this);" hotelcode="WSMA0511000015" suppliercode="CL096-CL124" droomcatg="WSMA05110034-RO" roomstatus="Y" id="bookWSMA0511000015WSMA05110034-RO-CL096-CL124"><img border="0" src="/b2b/images/result-hotels/btnAV-v3.gif"></span></div>
<div class="clear"></div>
</div>
<div class="bd-rate-row">
<div class="rtd1"><span class="rmname-rsht-rate">DELUXE</span><i></i></div>
<div class="rtd2"><span>Breakfast</span><i></i></div>
<div class="rtd3"><span><a href="javascript:sHC.ShowPrice('WSMA0511000015','WSMA05110034', 'BB','CL096-CL124');">2,847,470.00 IDR</a></span><i></i></div>
<div class="rtd4"><span class="btn-rsht-rate" onclick="sHC.jumpToPaxdetail(this);" hotelcode="WSMA0511000015" suppliercode="CL096-CL124" droomcatg="WSMA05110034-BB" roomstatus="Y" id="bookWSMA0511000015WSMA05110034-BB-CL096-CL124"><img border="0" src="/b2b/images/result-hotels/btnAV-v3.gif"></span></div>
<div class="clear"></div>
</div>
</span>
</div>
<div class="bd-rate-bottom">
<div class="rsht-cxl" id="CancelPolicyWSMA0511000015CL096-CL124" onclick="sHC.rCancel('WSMA0511000015CL096-CL124','CL096-CL124');" title="Click for view cancellation policy">
<textarea id="PolicyWSMA0511000015CL096-CL124" style="display:none"></textarea>
Cancellation Policy </div>
<div class="rsht-promotion" id="FOCWSMA0511000015CL096-CL124" onmouseover="sHC.popupHotelFOC(this, 'WSMA0511000015CL096-CL124','CL096-CL124');" detail="" style="display:none;">(Special Promotion)</div>
<div class="rsht-message" id="lyHotelMessageWSMA0511000015CL096-CL124"><blink><b><font color="red">Hotel Message</font> : </b></blink> <span id="HotelMessageWSMA0511000015CL096-CL124" style="word-wrap:break-word;">Complimentary WIFI internet access</span></div>
<div class="clear"></div>
</div>
</div>
如果还有这样的表结构,evaluate 函数只返回 1 甚至 0... 那么这个案子有什么问题呢?
如果我在检查元素 chrome 浏览器中进行 jQuery dom 计数,这就是我得到的结果
jQuery("#dResult > div:nth-child("+1+") > div > div:nth-child(4) > div:nth-child("+1+") > div:nth-child(1) > span > div").length;
8
jQuery("#dResult > div:nth-child("+1+") > div > div:nth-child(4) > div:nth-child("+2+") > div:nth-child(1) > span > div").length;
15
【问题讨论】:
-
您的代码没有问题。请提供一些标记和更大的代码 sn-p。这可能与迭代期间的范围问题有关。
-
我已经更新了我的问题...如果我在 google chrome 检查元素中进行 jquery dom 计数,我也会添加结果
标签: javascript css-selectors casperjs