Прежде чем ответить на вопрос, я хотел бы отметить, что если вы сможете добавить идентификатор для каждого пункта меню, это сделает поиск более простым и более производительным.
В этом сценарии вы можете сделать:
WebElement result = driver.findElement(By.id("myId"));
Если вы не можете добавить идентификатор, вы можете сделать что-то вроде этого:
WebElement result = driver.findElements(By.className("menu-popup-item-text")).stream()
.filter(webElement -> webElement.getText().contains("Mr."))
.findFirst().get();
После сцепления отладчика в Кассини я вижу, что пустой указатель касательно на самом деле прибывает из Системы. Сеть. Компиляция. CodeDomUtility. GenerateExpressionForValue, который в основном пытается получить выражение для интервала [], выстраивает Вас передача в конструктора Списка. С тех пор нет никакого дескриптора типа для интервала [] массива, он приводит к сбою (и бросает пустой указатель касательно в процессе, вместо "не может генерировать исключение набора свойств", что он должен).
Я не могу выяснить созданный способом получить сериализуемое значение в Список <интервал>, таким образом, я просто использовал статический метод:
class IntListConverter : TypeConverter {
public static List<int> FromString(string value) {
return new List<int>(
value
.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
.Select(s => Convert.ToInt32(s))
);
}
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) {
if (destinationType == typeof(InstanceDescriptor)) {
List<int> list = (List<int>)value;
return new InstanceDescriptor(this.GetType().GetMethod("FromString"),
new object[] { string.Join(",", list.Select(i => i.ToString()).ToArray()) }
);
}
return base.ConvertTo(context, culture, value, destinationType);
}
}
В то время как я не могу сказать, что у меня есть какой-то конкретный опыт с этой ошибкой, другие источники указывают, что необходимо добавить преобразование в тип, который проверяют InstanceDescriptor.:
http://weblogs.asp.net/bleroy/archive/2005/04/28/405013.aspx
Который дает объяснение причин или альтернативно:
http://forums.asp.net/p/1191839/2052438.aspx#2052438
Который обеспечивает пример кода, подобный Вашему.
Я решил что-то средство моделирования путем создания 2 свойств:
public List<int> ModuleIDs { get .... set ... }
public string ModuleIDstring { get ... set ... }
ModuleIDstring преобразовывает свой набор значений в список и устанавливает свойство ModuleIDs.
Это также сделает ModuleIDs применимым из PropertyGrid и т.д.
Хорошо, не лучшее, безопасное с точки зрения типов решение, но для меня это работает.
передайте список из кода позади...
aspx:
<UC:MyControl id="uc" runat="server" />
код - позади:
List<int> list = new List<int>();
list.add(1);
list.add(2);
list.add(3);
uc.ModuleIds = list;
Путем я обычно делаю это должно заставить свойство перенести набор ViewState. Ваш путь выглядит лучше, если это может быть сделано работать, но это сделает задание:
public IList<int> ModuleIds
{
get
{
string moduleIds = Convert.ToString(ViewState["ModuleIds"])
IList<int> list = new Collection<int>();
foreach(string moduleId in moduleIds.split(","))
{
list.Add(Convert.ToInt32(moduleId));
}
return list;
}
}
Я полагаю, что проблемой является набор {}. Конвертер типов хочет измениться List<int>
назад в строку, но CanConvertFrom()
сбои для List<int>
.
Можно передать его в строку и разделение на запятой для заполнения частной переменной. Не имеет точности атрибуции, но будет работать.
private List<int> modules;
public string ModuleIds
{
set{
if (!string.IsNullOrEmpty(value))
{
if (modules == null) modules = new List<int>();
var ids = value.Split(new []{','});
if (ids.Length>0)
foreach (var id in ids)
modules.Add((int.Parse(id)));
}
}
Я думаю, что Вы - наилучший вариант, должен заставить Ваш usercontrol иметь Свойство стиля источника данных.
Вы берете свойство в качестве объекта и затем делаете некоторую проверку типа по сравнению с IList/IEnumerable/и т.д., чтобы удостовериться, что это корректно.