Ext JS, скрывающий содержимое текстового поля от HTML и Selenium

Я писал автоматизацию тестирования (в Selenium2 Java, Firefox 3.6) приложения, которое использует много ExtJS. Мне удалось довольно хорошо обойти мощные идентификаторы морфируемых элементов, но на одной странице поведение кода поставило меня в тупик. Есть текстовое поле, в котором можно указать имя пользователя. На него нельзя щелкнуть, пока не будет нажата кнопка редактирования, а затем Firebug сможет найти текстовое поле. Если текст введен и затем сохранен, текст отображается на странице, но нигде в коде HTML не отображается. Даже если нажать кнопку редактирования еще раз, чтобы сделать текстовое поле доступным, я не могу получить значение текстового поля. Это код для метки и текстового поля в режиме редактирования:

<div class="x-form-item " tabindex="-1">
<label class="x-form-item-label" style="width: 250px;" for="ext-comp-1022">Interface Username:</label>
<div id="x-form-el-ext-comp-1022" class="x-form-element" style="padding-left: 255px;">
<input id="ext-comp-1022" class=" x-form-text x-form-field " type="text" name="interfaceUsername" autocomplete="off" size="20" style="width: 292px;">
</div>

Обратите внимание, что метка Username: отображается в HTML, как и ожидалось, но для самого текстового поля нет ничего. Я подозреваю, что вызов javascript получает и отображает текст в текстовом поле, но я совсем не знаком с ExtJS. Я проверил этот пост но это не относилось к получению текста, в основном это была проблема с изменением идентификатора. Итак, я хотел бы понять, как определить, какой скрипт вызывается, и как использовать executeScript для захвата текста текстового поля с ним. Я могу ввести текст в поле с помощью Selenium, сохранить его с помощью Selenium и увидеть его на странице на глаз, поэтому у меня нет проблем с самим кодом Selenium, определяющим местонахождение элемента.

Спасибо, Сабрина


person Sabrina    schedule 01.09.2011    source источник


Ответы (2)


Я до сих пор не знаю, как определить, какой сценарий вызывается, но по совету полезного коллеги я нашел обходной путь:

String userid=driver.findElementByName("interfaceUsername").getAttribute("id");
String username=(String)js.executeScript("return Ext.getCmp('"+userid+"').getValue()");

По имени элемента я получаю идентификатор (каким бы он ни был в тот день), а затем вызываю executeScript, чтобы узнать, что такое значение текстового поля. Ему не хватает элегантности, но тогда ExtJS не способствует элегантности.

person Sabrina    schedule 06.09.2011

Для имени пользователя поля должен быть атрибут значения. Итак, в firebug выберите поле Username и справа выберите опцию DOM. Должен быть атрибут значения с именем пользователя. Попробуйте что-то вроде ниже, допустим, ваш WebElement - это имя пользователя.

String user = username.getAttribute("value");
person nilesh    schedule 03.09.2011
comment
видимо ExtJs особенный. Нет такого поля значения в Firebug даже в DOM. Я посмотрел, правда! - person Sabrina; 06.09.2011