【问题标题】:onchange event does not get fired on selenium type command在 selenium 类型命令上不会触发 onchange 事件
【发布时间】:2011-01-14 10:13:55
【问题描述】:

我正在输入一些值,在更改时进行总计。但不知何故,这个事件并没有被 selenium 类型命令触发。

我也试过 typeKey 和 typeAt ..但没有成功。有什么解决方法吗?

【问题讨论】:

    标签: selenium automated-tests selenium-ide


    【解决方案1】:

    要触发 onchange 事件,请尝试在 Selenium IDE 中添加此命令:

    fireEvent targetID blur

    【讨论】:

    • 这应该是公认的答案(恕我直言)。这正是我所需要的!此外,就我而言,它必须与sendKeys 一起使用,而不是type。非常感谢@trex。
    【解决方案2】:

    Firefox 有一个bug,它可以防止在浏览器窗口失焦时执行某些事件。当您运行自动化测试时,这可能是一个问题 - 即使窗口失焦,它也可能正在输入。

    为了解决这个问题,我“手动”触发了更改事件,将 javascript 注入到我的测试中。:

    //suppose "element" is an input field
    element.sendKeys("value");
    JavascriptExecutor jsExecutor = (JavascriptExecutor) driver;
    jsExecutor.executeScript("$(arguments[0]).change();", element);
    

    您可能已经注意到,我使用 jQuery 来触发更改事件。如果你没有在你的应用上使用 jQuery,你可以查看here 如何使用 vanilla javascript 来触发它。

    希望对某人有所帮助。

    【讨论】:

      【解决方案3】:

      如果您使用的是 Selenium 1.x,则可以使用 fireEvent 命令在输入值后手动触发 onChange 事件。也许这会解决你的问题?

      【讨论】:

        【解决方案4】:

        您的解决方案通常可以通过查看 JavaScript 代码找到。

        您始终可以选择输入值并从代码中手动触发实际的 OnChange 事件。

        关于这个link text有一个未解决的问题 FireFox Windows 未处于活动状态并阻止触发 OnChange 的问题。

        在使用 typeKeys 命令之前试试这个:

        selenium.selectWindow(null);
        

        【讨论】:

        • 我正在使用 IDE。这就是我所做的。 [ #执行:|getEval | selenium.selectWindow(null) || ] 不工作。错误:selenium.selectWindow 不是函数
        • 我通常只使用 Selenium RC,我不确定它是否可以解决 IDE 的一些问题。你应该用这些信息更新你的问题
        【解决方案5】:

        这在 IDE 中对我有用 按顺序执行以下3个命令

        Typekeys   targetID    input
        FireEvent  targetID    focus
        Type       targetID    input
        

        来源看起来像这样(输入是字母r

        <tr>
        <td>typeKeys</td>
        <td>//form/input</td>
        <td>r</td>
        </tr>
        <tr>
        <td>fireEvent</td>
        <td>//form/input</td>
        <td>focus</td>
        <tr>
        <td>fireEvent</td>
        <td>//form/input</td>
        <td>focus</td>
        </tr>
        <tr>
        <td>type</td>
        <td>//form/input</td>
        <td>r</td>
        </tr>
        </tr>
        <tr>
        <td>type</td>
        <td>//form/input</td>
        <td>r</td>
        </tr>
        

        【讨论】:

          【解决方案6】:

          看起来“sendKeys”命令是为了纠正这个问题:

          https://code.google.com/p/selenium/issues/detail?id=5451

          这对我有用。

          <tr>
              <td>sendKeys</td>
              <td>id=Quantity</td>
              <td>Type stuff here</td>
          </tr>
          

          【讨论】:

            【解决方案7】:

            我遇到了类似的问题,使用 Ajax 制作了一个下拉列表。
            当用户在字段中键入时,系统会显示 AJAX divw 并带有多个选项,每个选项都作为与 target='#' 的链接

            更糟糕的是,在 onChange() 上调用了一个函数来填充系统标志,并且该标志将用作 form.submit() 的验证 (哦,痛苦)

            无论如何,我的解决方案是:
            1 - Selenium sendKeys 命令,这样 Ajax div 就会出现

            <tr>
                <td>sendKeys</td>
                <td>id=txtTipoDocumento</td>
                <td>ipsum lorem</td>
            </tr>
            

            2 - 等待带有预期选项的链接出现

            <tr>
                <td>waitForElementPresent</td>
                <td>link=ipsum lorem</td>
                <td></td>
            </tr>
            

            3 - selenium clickAt 链接

            <tr>
                <td>clickAt</td>
                <td>link=ipsum lorem</td>
                <td>10,20</td>
            </tr>
            


            4 - 这是其中的一个问题:手动触发 onChange()blur 事件。另外,请让浏览器将焦点设置在 不同 字段上

             <tr>
                    <td>fireEvent</td>
                    <td>id=txtTipoDocumento</td>
                    <td>blur</td>
                </tr>
                <tr>
                    <td>fireEvent</td>
                    <td>id=selSerie</td>
                    <td>change()</td>
                </tr>
                <tr>
                    <td>fireEvent</td>
                    <td>id=selSerie</td>
                    <td>blur</td>
                </tr>
                <tr>
                    <td>focus</td>
                    <td>id=imgDataElaboracao</td>
                    <td></td>
                </tr>
            

            5 - 最后,可以肯定的是,我让 Selenium 在表单的提交按钮上执行 ClickAt() 命令,在 mouseDown 和 MouseUp 命令之间

            <tr>
                <td>mouseDown</td>
                <td>id=btnSalvar</td>
                <td></td>
            </tr>
            <tr>
                <td>focus</td>
                <td>id=btnSalvar</td>
                <td></td>
            </tr>
            <tr>
                <td>clickAt</td>
                <td>id=btnSalvar</td>
                <td>10,20</td>
            </tr>
            


            不优雅,但很有效。

            【讨论】:

              【解决方案8】:

              我遇到了同样的问题,但能够解决这个问题。下面的代码用于在输入字段中输入文本并触发 onchange 事件。

              WebElement textBox = driver.findElement(By.xpath(xpath));
              textBox.sendKeys("Test");
              ((JavascriptExecutor) driver).executeScript("arguments[0].onchange", 
                Arrays.asList(textBox));
              

              希望它会起作用!

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2012-06-12
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-12-04
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多