【问题标题】:Selecting a date value from a dynamically generated listbox从动态生成的列表框中选择日期值
【发布时间】:2012-08-30 17:00:37
【问题描述】:

我有一个列表框,其值是动态生成的。列表框包含月份和年份,生成时如下所示。

<select name="arr_dtm_mon_year" tabindex="150" class="input">
    <option value=""></option>
    <option value="NOV 09">Nov 09</option>
    <option value="DEC 09">Dec 09</option>
    <option value="JAN 10">Jan 10</option>
    <option value="FEB 10">Feb 10</option>
    <option value="MAR 10">Mar 10</option>
    <option value="APR 10">Apr 10</option>
    <option value="MAY 10">May 10</option>
    <option value="JUN 10" selected>Jun 10</option>
    <option value="JUL 10">Jul 10</option>
    <option value="AUG 10">Aug 10</option>
    <option value="SEP 10">Sep 10</option>
    <option value="OCT 10">Oct 10</option>
</select> 

列表框中默认选中的元素是当前月份。当我使用 selenium IDE 从此列表框中进行选择时,它工作正常。以下是我用来从列表框中选择的示例命令。

<tr>
    <td>select</td>
    <td>arr_dtm_mon_year</td>
    <td>label=Oct 10</td>
</tr>
<tr>
    <td>select</td>
    <td>arr_dtm_mon_year</td>
    <td>label=May 10</td>
</tr>

现在我遇到的问题是列表框中的值是动态生成的。在上面的示例中,我选择了“5 月 10 日”选项。生成的值是所有前六个月的列表和所有未来六个月的列表。

这基本上意味着如果我从现在起 6 个月后重新运行测试,“5 月 10 日”将不会从列表中获得。是否可以动态选择值。例如,我可以先计算当前月份并选择当前月份 + 1(即下个月)的值。还有,在我确定下个月是什么之后,如何建立要选择的值。

任何帮助将不胜感激。

【问题讨论】:

    标签: testing selenium


    【解决方案1】:

    您可以根据项目在列表中的位置(零索引)来选择项目。以下将选择第三项:

    <tr>
        <td>select</td>
        <td>name=arr_dtm_mon_year</td>
        <td>index=2</td>
    </tr>
    

    如果您还想知道您选择的值的标签(或想使用它按标签选择作为您的原始代码),您可以使用以下内容:

    <tr>
        <td>storeText</td>
        <td>css=select[name=arr_dtm_mon_year] option:nth-child(3)</td>
        <td>label</td>
    </tr>
    

    然后您可以按如下方式使用它:

    <tr>
        <td>select</td>
        <td>name=arr_dtm_mon_year</td>
        <td>label=${label}</td>
    </tr>
    

    希望这是有道理的! :)

    【讨论】:

    • 是的,这很有意义。如果它有效,那就太棒了。我马上试试。非常感谢
    • 嗨,它工作得很好。有没有办法找出第 n 项(或索引 2)中的值是否是当前月份加 1?谢谢
    • 有可能,是的。由于它是一个不同的解决方案,我已将其添加为单独的答案。
    【解决方案2】:

    您可以使用storeEval 计算下个月(下个月是一月)。下面是一个工作示例:

    <tr>
        <td>storeEval</td>
        <td>var months = new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"); var now = new Date(); if (now.getMonth() == 11) { nextMonth = new Date(now.getFullYear() + 1, 0, 1); } else { nextMonth = new Date(now.getFullYear(), now.getMonth() + 1, 1); } months[nextMonth.getMonth()] + " " + nextMonth.getFullYear().toString().slice(2);</td>
        <td>label</td>
    </tr>
    <tr>
        <td>select</td>
        <td>name=arr_dtm_mon_year</td>
        <td>label=${label}</td>
    </tr>
    

    请注意,这可能会使您的测试更加脆弱。它取决于系统时钟,并且可能存在无法按预期工作的边缘情况。

    【讨论】:

    • 感谢您的帮助。我需要稍微修改一下才能得到我需要的东西,但你给了我一个很好的开端。谢谢
    【解决方案3】:

    我认为它适用于 target index = orderliness(它从 0 开始)。

    【讨论】:

      猜你喜欢
      • 2015-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-28
      • 1970-01-01
      • 2019-05-01
      相关资源
      最近更新 更多