Поиск набора полей с помощью объекта страницы

Я пытаюсь найти набор флажков, но мне нужно найти их в наборе полей. HTML-код такой (это gwt-приложение, поэтому генерируется множество вещей:

<div id="UpdateUserView-RolesColumn">
  <fieldset style="">
    <legend>Primary Role</legend>
    <select class="gwt-ListBox">
      <option value="ROLE_GENERAL_USER">ROLE_GENERAL_USER</option>
      <option value="ROLE_ADMIN">ROLE_ADMIN</option>
    </select>
    </fieldset>
  <fieldset style="" class="createUser-otherRolesFieldset">
    <legend>Other Roles / Permissions</legend>
    <div style="overflow: auto; position: relative; zoom: 1; height: 250px;">
      <div style="position: relative; zoom: 1;">
        <div>
          <span class="gwt-CheckBox">
            <input type="checkbox" value="on" id="gwt-uid-760" tabindex="0" checked="">
            <label for="gwt-uid-760">ROLE_BLAH1_USER</label>
          </span>
          <span class="gwt-CheckBox">
            <input type="checkbox" value="on" id="gwt-uid-761" tabindex="0" checked="">
            <label for="gwt-uid-761">ROLE_BLAH2_USER</label>
          </span>
          <span class="gwt-CheckBox">
            <input type="checkbox" value="on" id="gwt-uid-762" tabindex="0" checked="">
            <label for="gwt-uid-762">ROLE_BLAH3_USER</label>
          </span>
          <span class="gwt-CheckBox">
            <input type="checkbox" value="on" id="gwt-uid-763" tabindex="0" checked="">
            <label for="gwt-uid-763">ROLE_BLAH4_USER</label>
          </span>
          <span class="gwt-CheckBox">
            <input type="checkbox" value="on" id="gwt-uid-764" tabindex="0" checked="">
            <label for="gwt-uid-764">ROLE_BLAH5_USER</label>
          </span>
        </div>
      </div>
    </div>
  </fieldset>
</div>

Я использую Watir и гем page-object. Я пытаюсь найти набор полей, но элемента набора полей нет. Что мне нужно сделать в долгосрочной перспективе, так это найти каждый флажок, получить значение того, отмечен он или нет, и сохранить его в хеше вместе с его именем.

Даже если у объекта страницы был метод набора полей, я не знаю, как найти каждый последующий флажок и получить значение и метку.


person snowe    schedule 27.03.2013    source источник


Ответы (1)


Вы можете объявить набор полей, используя универсальный метод доступа element. . Для вашего набора полей это будет:

element(:other_roles, :fieldset, :class => 'createUser-otherRolesFieldset')

Чтобы создать хэш значений, вам нужно будет создать метод, который выполняет итерацию диапазонов и сохраняет значения меток и значения флажков. Следующий класс объекта страницы имеет метод для этого:

class MyPage
    include PageObject

    element(:other_roles, :fieldset, :class => 'createUser-otherRolesFieldset')

    def other_role_values()
        other_roles = {}
        other_roles_element.span_elements.each do |span|
            other_roles[span.label_element.text] = span.checkbox_element.checked?
        end
        return other_roles
    end
end

Как видите, метод other_role_values вернет хеш, который указан по имени (которое, я полагаю, вы имеете в виду метку) со значением флажка (true или false).

page = MyPage.new(browser)
p page.other_role_values
#=> {"ROLE_BLAH1_USER"=>true, "ROLE_BLAH2_USER"=>true, "ROLE_BLAH3_USER"=>true, "ROLE_BLAH4_USER"=>true, "ROLE_BLAH5_USER"=>true}

В сторону

В ответ на комментарий Чака то же самое можно написать без гема объекта страницы.

В Ватире:

other_roles_element = browser.fieldset(:class => 'createUser-otherRolesFieldset')
other_roles = {}
other_roles_element.spans.each do |span|
  other_roles[span.label.text] = span.checkbox.checked?
end
p other_roles

В Selenium-Webdriver:

other_roles_element = browser.find_element(:css => 'fieldset.createUser-otherRolesFieldset')
other_roles = {}
other_roles_element.find_elements(:tag_name => 'span').each do |span|
  other_roles[span.find_element(:tag_name => 'label').text] = span.find_element(:tag_name => 'input').selected?
end
p other_roles
person Justin Ko    schedule 27.03.2013
comment
ах, это сработало красиво. Я совершенно забыл о методе доступа к элементам. Спасибо! - person snowe; 28.03.2013
comment
Молодец, Джастин, мне всегда нравилось, когда подобную сложную задачу можно решить всего несколькими чистыми строками кода. Я должен задаться вопросом, как бы это выглядело, если бы я попробовал то же самое, используя Selenium? У меня такое чувство, что это тот случай, когда Ватир лучше, но это может быть предубеждение, было бы неплохо увидеть код, чтобы узнать, прав я или нет. - person Chuck van der Linden; 28.03.2013
comment
@ChuckvanderLinden, растворы чистого ватира и селена в основном одинаковы (см. обновленный ответ). Решение для селена немного более многословно, но не более, чем обычно. - person Justin Ko; 30.03.2013