从动态生成的列表框中选择日期值

时间:2010-06-15 13:51:20

标签: testing selenium

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

<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(即下个月)的值。在确定下个月的情况后,我如何构建要选择的价值。

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

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

<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>

希望有道理! :)

答案 1 :(得分:2)

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

<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>

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

答案 2 :(得分:1)

我认为它适用于目标索引=有序(从0开始)。