Selenium:有时以多个标签的形式输入的数据会消失

时间:2013-06-20 19:14:07

标签: java selenium-webdriver

我有一个带有复杂数据输入表单的Web应用程序,其中包含一些选项卡,用于保存各种配置项的输入字段。我正在编写一个测试,在不同选项卡上的字段中输入数据,然后执行保存。当我输入每个项目时,我确认数据输入控件具有我选择的文本或值,然后再继续下一步。我发现有时候,但并非总是如此,当我移动到另一个选项卡时,上一个选项卡上的字段会丢失我输入的数据。

如何防止这种情况?

我在Java中使用Selenium 2和WebDriver,并使用Firefox运行测试。

我在两个领域遇到了麻烦:

一个是简单的文本输入字段 第二个是带有自动完成功能的文本输入框

这两个字段是我在切换标签之前输入数据的最后一个字段。在切换标签之前我输入数据的其他字段都没有丢失数据。在转到新标签之前,我只是与之交互。

我已经尝试检查在将文本发送到输入字段的方法的末尾加载JQuery,但它似乎没有帮助。检查JQuery的方法返回true,有时数据仍然被删除。

手动输入数据时从未发生这种情况,而且在另一个仅在一个标签上输入数据的自动化测试中也不会发生这种情况。

以下是输入文本时自动填充字段的html,并且没有触发自动填充的待处理输入:

<div id="s2id_autogen5" class="select2-container select2-container-multi select2">
    <ul class="select2-choices" style="">
        <li class="select2-search-choice">
            <div>
                htm
            </div>
            <a class="select2-search-choice-close" tabindex="-1" onclick="return false;" href="#"></a>
        </li>
        <li class="select2-search-field">
            <input class="select2-input" type="text" autocomplete="off" tabindex="0" style="width: 10px;"></input>
        </li>
    </ul>
</div>

以下是简单文本输入字段的html源:

<td class="optionValue option_sr_test_object_url">
    <input id="option_d03e6450-5990-4a31-8e84-5b1af89d2c47_sr_test_object_url" type="text" placeholder="e.g. /path/testobject.html" value="/path/test.html">
    </input>
</td>

2 个答案:

答案 0 :(得分:0)

在经历了几天的挣扎之后,我对我的问题有了部分解决方案:

对于简单文本输入框,如果我发送Keys.TAB将焦点更改为下一个输入字段,那么当我切换到另一个选项卡时,数据 USUALLY 不会被删除形成。当焦点切换到另一个字段(但不是另一个选项卡)时,必须有一些事件被触发,当仅使用sendKeys输入文本时,该字段不会触发。但是,在某些情况下,数据偶尔会消失。

对于具有自动完成功能的输入,我必须发送Keys.RETURN或Keys.TAB才能成功将文本输入到字段中。使用此字段,您可以从自动完成列表中选择一个选项,或者只需按Enter键或Tab键输入与自动填充选项之一不匹配的文本。使用Keys.RETURN或Keys.TAB输入文本后,我需要通过发送Keys.TAB将焦点更改为另一个字段。同样,我认为这是需要触发的一些事件,以便数据保留,并且该事件仅在焦点更改为另一个输入字段后才会触发,但如果我切换标签则不会发生。

检查JQuery没有活动请求没有帮助,因为在某些情况下,即使没有活动查询,数据仍会偶尔从一个或两个字段中消失。

我需要一种非常简单的方法来消除所有情况下的这个问题。我宁愿不用硬编码睡觉。也许有一种更好的技术可以用非编码方式设置好等待?我希望有一个完整的解决方案来解决我的问题,因为考虑到这个解决方案并非万无一失,我不能接受这个作为问题的答案。

答案 1 :(得分:0)

我终于找到了可靠地防止这种情况发生的事情:

driver.switchTo()窗口(driver.getWindowHandle());

当我在切换标签之前执行该行时,我之前输入的数据未被清除。我不知道为什么会这样,我也不记得我是如何找到这个解决方案的。几个月来,我一直想用这个答案更新这个问题,但我一直忘记这样做。