1

我正在研究基于 Chrome 的聊天/IM 平台的自动化测试。

一种情况是获取所有联系人信息。联系人被放置在组中,并且可以通过单击组名称来查看或隐藏。

我试图发布图片但被拒绝说我没有足够的声誉点:(

HTML 源代码如下所示:


    <div id="connectionListItems">
      <ul class="connections" style="height: 2783px;">
        <li class="group collapsed" data-item-id="SUGAR" data-name="SUGAR" style="top: 0px;"> ... /li>
        <li class="group collapsed" data-item-id="Desk Connections" data-name="Desk Connections" style="top: 23px;"> ... /li>
        <li class="group expanded" data-item-id="Default" data-name="Default" style="top: 46px;">
          <span class="name"> Default <span class="count">(0/118)</span> </span>  ... /li>
        <li class="connection" data-item-id="Default~klxkqbs_tu-yahoo" style="top: 69px;">
          <span class="name">(ABN) James</span>  </li>
        <li class="connection" data-item-id="Default~klxkqbs_tq-yahoo" style="top: 92px;">
          <span class="name">(ABN) Justin</span> </li>
        <li class="connection" data-item-id="Default~klxkqbs_wm-yahoo" style="top: 115px;">
          <span class="name">(ABN) Matt</span>  </li>
       .......
     </ul>
   </div>

我的 Watir 脚本如下所示:


    def getContactCount(browser, outputfile)
      iframe_chat = browser.iframe(:src => "/tribe/connectionlist/index.html#appId/3")
      ul_conns = iframe_chat.div(:id => "connectionList").div(:id => "connectionListItems").ul(:class => "connections")
      numGroups = ul_conns.lis(:class => /group/).length
      outputfile.puts "- Contact count -- total groups: " + numGroups.to_s
      grpName = Array.new
      ul_conns.lis(:class => /group/).each { |li| grpName.push li.data_name }
      for igrp in 1..numGroups
         list_grp = ul_conns.li(:data_name => grpName[igrp-1])
         outputfile.puts "     Group " + list_grp.text
         list_grp.click
         outputfile.puts "     Number of contacts found: " + ul_conns.lis(:class => "connection").length.to_s
         ul_conns.lis(:class => "connection").each { |li| outputfile.puts "        " + li.span(:class => "name").text }
         list_grp.click
      end
    end

这是输出:


    - Contact count -- total groups: 3
     Group SUGAR (0/11)
     Number of contacts found: 11
        (GFI) Joachim
        (ICAP) Kissel
        (JB Drax) James
        (JB Drax) Simon
        (JPM) Jason
        (JPM) Jeb
        (JSG) Steven
        (Macq) NY SB Desk
        (NE) Chris
        (RJO) Babe
        (RJO) Croce
     Group Desk Connections (1/88)
     Number of contacts found: 55
        ICM_am
        (ABN) Alex
        (ABN) James
        (ABN) Justin
        (ADM) Marie
        (Alliance) Victor
        (Arfinco) Bruno
        (Arfinco) Nico
        .......
     Group Default (0/118)
     Number of contacts found: 54
        (ABN) James
        (ABN) Justin
        (ABN) Matt
        ......

问题是,对于组“Desk Connections”和“Default”,脚本仅检索到部分联系人(分别为 88 个中的 55 个、118 个中的 54 个)。

实际上,当我在 Chrome 浏览器中查看 HTML 源代码时,也只列出了其中的一部分。但是当我向下滚动框架时,会显示更多内容(但顶部的那些变得不可见)。

有人可以看看和帮助吗?如何获得所有“li”(class="connection")?

让我知道是否需要更多信息。

非常感谢。

4

1 回答 1

0

我认为解决问题的关键是滚动框架。您可以使用以下方法滚动到框架的末尾(即最后一个元素):

browser.frame(:id => 'frame_id).elements.last.wd.location_once_scrolled_into_view

从理论上讲,一旦你这样做,它将导致下一组元素加载(而其他元素消失)。

由于您一次只能看到(在 DOM 中)一页结果,因此您需要捕获结果,滚动到底部,等待列表重新加载,然后捕获更多结果。

这大致是您需要做的(尽管我猜测没有测试页面):

# Get the results of your first 'page'
results = iframe_chat.lis.collect(&:text)

# Scroll to the bottom to get more results
iframe_chat.elements.last.wd.location_once_scrolled_into_view

# Wait for the list to refresh 
# I am checking that the last li disappears.
# You may need to check for something to appear as well.
iframe_chat.li(:text => results.last).wait_while_present

# Get the results of your second 'page'
results = iframe_chat.lis.collect(&:text)
于 2013-10-15T11:43:24.130 回答