Событие onchange не запускается по команде типа селен - PullRequest
8 голосов
/ 14 января 2011

Я набираю какое-то значение, при изменении делаю итог. Но почему-то это событие не запускается командой типа селен.

Я также попробовал typeKey и typeAt .. Но безуспешно. Есть ли обходной путь для этого?

Ответы [ 7 ]

8 голосов
/ 18 июля 2012

Чтобы вызвать событие onchange, попробуйте добавить эту команду в Selenium IDE:

fireEvent targetID blur

6 голосов
/ 26 июля 2013

Firefox имеет ошибку , которая предотвращает выполнение некоторых событий, когда окно браузера не в фокусе. Это может быть проблемой, когда вы запускаете свои тесты автоматизации - которые могут печатать, даже если окно не в фокусе.

Чтобы исправить эту проблему, я вызвал событие изменения «вручную», внедрив javascript в свои тесты.

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

Как вы могли заметить, я использую jQuery для запуска события изменения. Если вы не используете jQuery в своем приложении, вы можете проверить здесь , как вызвать его с помощью vanilla javascript.

Надеюсь, это кому-нибудь поможет.

3 голосов
/ 15 января 2011

Если вы используете Selenium 1.x, есть команда fireEvent, которую вы можете использовать для ручного запуска события onChange после ввода значения.Может быть, это решит вашу проблему?

1 голос
/ 05 мая 2015

Похоже, что команда 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>
1 голос
/ 26 января 2012

Это сработало для меня в 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>
1 голос
/ 14 января 2011

Ваше решение обычно можно найти, посмотрев на код JavaScript ..

У вас всегда есть возможность ввести значение и вручную запустить фактическое событие OnChange из кода.

Есть открытый вопрос по этому тексту ссылки Проблема с тем, что FireFox Windows не активен и препятствует запуску OnChange.

Попробуйте это перед использованием команды typeKeys:

selenium.selectWindow(null);
0 голосов
/ 09 июля 2016

У меня была похожая проблема с выпадающим списком, созданным с помощью Ajax.
Когда пользователь вводит поле, система отображает AJAX div w с несколькими опциями, каждая из которых представляет собой ссылку с target='#'

И, что еще хуже, на * была вызвана функция onChange () , который заполнил системный флаг, и этот флаг будет использоваться в качестве проверки в форме ..submit () (о, боль)

В любом случае, мое решение для этого:
1 - команда Selenium sendKeys , чтобы появился div Ajax

<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 - селен щелкните по по ссылке

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


4 - Вот ОДИН из уловов: вручную запустите onChange () И размытие событий.Кроме того, используйте браузер, чтобы установить фокус на другое поле

 <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 () в SubmitКнопка forme, между командами 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>


Не элегантно, но работает.

...