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)


arrow_upward
1
arrow_downward

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

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

arrow_upward
0
arrow_downward

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

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