Selendroid является платформой автоматизации тестирования для собственных или гибридных приложений для Android и мобильного Интернета.

Selendroid является платформой автоматизации тестирования, которая прогоняет UI Android исходные и гибридные приложения (приложения) и мобильный Интернет. Тесты записаны с помощью Селена 2 клиента API!

Selendroid может использоваться на эмуляторах и физических устройствах и может быть интегрирован как узел в Сетку Селена для масштабирования и параллельного тестирования.

---------121 тег--------95183----JSF для создания одно-избранного меню.

JSF отмечают для создания одно-избранного меню.

A <h:selectOneMenu> компонент UI JSF, который генерирует HTML <select> элемент, который позволяет Вам связывать выбранное значение со свойством управляемого компонента.

Основной пример

Можно использовать <f:selectItem> определить пункты меню, которые сгенерированы как HTML <option> элементы.

Посмотреть:

<h:form> <h:selectOneMenu value="#{bean.selectedItem}"> <f:selectItem itemValue="#{null}" itemLabel="-- select one --" /> <f:selectItem itemValue="foo" itemLabel="Foo label" /> <f:selectItem itemValue="bar" itemLabel="Bar label" /> <f:selectItem itemValue="baz" itemLabel="Baz label" /> </h:selectOneMenu> <h:commandButton value="Submit" action="#{bean.submit}" /> </h:form> 

Модель:

private String selectedItem; // +getter +setter public void submit() { System.out.println("Selected item: " + selectedItem); } 

itemValue то, что будет установлено как свойство управляемого компонента. itemLabel то, что будет отображено как маркировка опции в UI. Если itemLabel опущен, затем это примет значение по умолчанию к тому же значению как itemValue.

Можно предварительно выбрать объект путем предоставления selectedItem значение в бобе (сообщение) конструктор. Например.

@PostConstruct public void init() { selectedItem = "bar"; } 

Это покажет меню с "Маркировкой панели", предварительно выбранной.

Динамический список

Можно использовать <f:selectItems> отобразить список, который динамично заполняется в отступающем бобе. Можно использовать javax.faces.model.SelectItem представить пару значения объекта и маркировки.

Посмотреть:

<h:form> <h:selectOneMenu value="#{bean.selectedItem}"> <f:selectItem itemValue="#{null}" itemLabel="-- select one --" /> <f:selectItems value="#{bean.availableItems}" /> </h:selectOneMenu> <h:commandButton value="Submit" action="#{bean.submit}" /> </h:form> 

Модель:

private String selectedItem; // +getter +setter private List<SelectItem> availableItems; // +getter (no setter necessary) @PostConstruct public void init() { availableItems = new ArrayList<SelectItem>(); availableItems.add(new SelectItem("foo", "Foo label")); availableItems.add(new SelectItem("bar", "Bar label")); availableItems.add(new SelectItem("baz", "Baz label")); } 

availableItems может также быть a SelectItem[]. Если Вы опускаете маркировку объекта и таким образом можете использовать значение объекта и в качестве значения опции и в качестве маркировки опции, то можно также использовать a List<String> или String[] вместо этого.

private String selectedItem; // +getter +setter private List<String> availableItems; // +getter (no setter necessary) @PostConstruct public void init() { availableItems = Arrays.asList("foo", "bar", "baz"); } 

A Set также поддерживается.

private String selectedItem; // +getter +setter private Set<String> availableItems; // +getter (no setter necessary) @PostConstruct public void init() { availableItems = new LinkedHashSet<String>(Arrays.asList("foo", "bar", "baz")); } 

Обратите внимание, что необходимо использовать a LinkedHashSet поддерживать порядок вставки или a TreeSet если Вы хотите автоматическую сортировку по значению. A HashSet по своей природе не заказан.

Динамический список с группами

Можно использовать SelectItemGroup к объектам группы.

private String selectedItem; // +getter +setter private List<SelectItem> availableItems; // +getter (no setter necessary) @PostConstruct public void init { availableItems = new ArrayList<SelectItem>(); SelectItemGroup group1 = new SelectItemGroup("Group 1"); group1.setSelectItems(new SelectItem[] { new SelectItem("Group 1 Value 1", "Group 1 Label 1"), new SelectItem("Group 1 Value 2", "Group 1 Label 2"), new SelectItem("Group 1 Value 3", "Group 1 Label 3") }); availableItems.add(group1); SelectItemGroup group2 = new SelectItemGroup("Group 2"); group2.setSelectItems(new SelectItem[] { new SelectItem("Group 2 Value 1", "Group 2 Label 1"), new SelectItem("Group 2 Value 2", "Group 2 Label 2"), new SelectItem("Group 2 Value 3", "Group 2 Label 3") }); availableItems.add(group2); } 

Вот то, как это похоже в браузере (обратите внимание, что Группа 1 и Группа 2 не можно выбрать):

alt text

Динамическая карта

<f:selectItems> также поддержки a Map<K, V> где K должен быть представлен как маркировка объекта и V должен быть представлен как значение объекта.

Посмотреть:

<h:form> <h:selectOneMenu value="#{bean.selectedItem}"> <f:selectItem itemValue="#{null}" itemLabel="-- select one --" /> <f:selectItems value="#{bean.availableItems}" /> </h:selectOneMenu> <h:commandButton value="Submit" action="#{bean.submit}" /> </h:form> 

Модель:

private String selectedItem; // +getter +setter private Map<String, String> availableItems; // +getter (no setter necessary) @PostConstruct public void init() { availableItems = new LinkedHashMap<String, String>(); availableItems.put("Foo label", "foo"); availableItems.put("Bar label", "bar"); availableItems.put("Baz label", "baz"); } 

Если Вы хотите подкачать K и V в стороне представления так, чтобы Вы могли заполнить значения объекта и маркировали наоборот как, следует

@PostConstruct public void init() { availableItems = new LinkedHashMap<String, String>(); availableItems.put("foo", "Foo label"); availableItems.put("bar", "Bar label"); availableItems.put("baz", "Baz Label"); } 

Затем сначала необходимо удостовериться, что поддержка сред EL 2.2 (часть Сервлета 3.0, т.е. целевой сервер является Tomcat 7, Glassfish 3, и т.д. и web.xml объявляется приспосабливают Сервлету 3.0), затем можно выполнить итерации Map#entrySet() в <f:selectItems> следующим образом:

<f:selectItems value="#{bean.availableItems.entrySet()}" var="entry" itemValue="#{entry.key}" itemLabel="#{entry.value}" /> 

Обратите внимание, что необходимо использовать a LinkedHashMap поддерживать порядок вставки или a TreeMap если Вы хотите автоматическую сортировку по ключу карты. A HashMap по своей природе не заказан.

Динамический список объектов

Начиная с JSF 2.0 можно также использовать a List<Bean> или Bean[] вместо этого, где Bean просто произвольный javabean класс. Предположение, что у Вас есть a Country боб с два String свойства code и name и Вы хотите сохранить code как значение выбранного пункта и дисплей name как маркировка объекта, затем можно использовать var атрибут <f:selectItems> без потребности преобразовать его в List<SelectItem> или SelectItem[].

Посмотреть:

<h:form> <h:selectOneMenu value="#{bean.countryCode}"> <f:selectItem itemValue="#{null}" itemLabel="-- select one --" /> <f:selectItems value="#{bean.countries}" var="country" itemValue="#{country.code}" itemLabel="#{country.name}" /> </h:selectOneMenu> <h:commandButton value="Submit" action="#{bean.submit}" /> </h:form> 

Модель:

private String countryCode; // +getter +setter private List<Country> countries; // +getter (no setter necessary) @EJB private DataService service; @PostConstruct public void init() { countries = service.getCountries(); // If this is a static list, you'd rather put this // in a separate application scoped bean instead. } public void submit() { System.out.println("Selected country code: " + countryCode); } 

Храня объекты как значение объекта

От примера в предыдущем разделе можно также установить целое Country как свойство управляемого компонента. Необходимо было бы только создать преобразователь, который преобразовывает между Country и String. Более конкретный пример может быть найден в тех ответах:

Ошибка проверки: Значение не допустимо

Эта страшная ошибка произойдет, когда примерно следующее произойдет под покрытиями JSF во время представления формы:

String submittedValue = request.getParameter(component.getClientId()); Converter converter = component.getConverter(); Object selectedItem = (converter != null) ? converter.getAsObject(context, component, submittedValue) : submittedValue; boolean valid = false; for (Object availableItem : bean.getAvailableItems()) { if (selectedItem.equals(availableItem)) { valid = true; break; } } if (!valid) { throw new ValidatorException("Validation Error: Value is not valid"); } 

Вы видите, произойдет, когда выбранный пункт не будет равняться ни одному из доступных объектов. Это может в свою очередь иметь 3 причины:

  1. Список доступных объектов от боба изменился во время формы, отправляют.
  2. equals() метод типа объекта позади объекта отсутствует или поврежденный.
  3. Если кто-либо используемый, преобразователь возвратил неправильный объект или даже null на getAsObject().

См. также этот ответ: Ошибка Проверки: Значение не допустимо.

Статический список перечислений

Можно также использовать enum как доступные объекты и выбранный пункт.

Посмотреть:

<h:form> <h:selectOneMenu value="#{bean.selectedItem}"> <f:selectItem itemValue="#{null}" itemLabel="-- select one --" /> <f:selectItems value="#{bean.availableItems}" /> </h:selectOneMenu> <h:commandButton value="Submit" action="#{bean.submit}" /> </h:form> 

Модель:

public enum Option { FOO, BAR, BAZ; } private Option selectedItem; // +getter +setter public void submit() { System.out.println("Selected item: " + selectedItem); } public Option[] getAvailableItems() { return Option.values(); } 

См. также этот ответ, как изменить и интернационализировать маркировки объекта: Как использовать перечислимые значения в f:selectItem (s).

Заполните нижестоящее меню

Можно использовать JSF 2.0 <f:ajax> отметьте для динамичного заполнения нижестоящего меню в зависимости от выбранного пункта текущего меню. Вот пример, который делает это для городов стран.

Посмотреть:

<h:selectOneMenu value="#{bean.country}" converter="countryConverter"> <f:selectItem itemValue="#{null}" itemLabel="-- select one --" /> <f:selectItems value="#{bean.countries}" var="country" itemValue="#{country}" itemLabel="#{country.name}" /> <f:ajax listener="#{bean.loadCities}" render="cities" /> </h:selectOneMenu> <h:selectOneMenu id="cities" value="#{bean.city}" converter="cityConverter"> <f:selectItem itemValue="#{null}" itemLabel="-- select one --" /> <f:selectItems value="#{bean.cities}" var="city" itemValue="#{city}" itemLabel="#{city.name}" /> </h:selectOneMenu> 

Модель в @ViewScoped боб:

private Country country; // +getter +setter private City city; // +getter +setter private List<Country> countries; // +getter private List<City> cities; // +getter @EJB private DataService service; @PostConstruct public void loadCountries() { countries = service.getCountries(); } public void loadCities() { cities = service.getCities(country); }