найти элемент

Master Woo

Client
Регистрация
06.12.2014
Сообщения
122
Благодарностей
129
Баллы
43
добрый день форумчане, помогите с такой вот задачей

есть веб страница от сетевого оборудования (ссылку дать не могу ибо она в локалке)

на ней есть куча элементов типа "input:radio" единственный уникальный атрибут value, но проблема в том, что от оборудования к оборудованию он меняется(например на одном он может быть value=16 на другом value=17), единственное как его можно определить это по вложеному атрибуту Label, он всегда не изменен. Соответственно вопрос как найти данный родительский атрибут?
Код:
<div class="form">
    <p>
<input type="radio" name="$RadioGroup" checked="checked" value="0" class="radio"> <label>
Stonesoft Invisible Token </label>
                            </p>
    <p>
<input type="radio" name="$RadioGroup" value="1" class="radio"> <label>
Stonesoft Web </label>
                            </p>
    <p>
<input type="radio" name="$RadioGroup" value="2" class="radio"> <label>
Stonesoft Challenge </label>
                            </p>
    <p>
<input type="radio" name="$RadioGroup" value="3" class="radio"> <label>
Stonesoft Synchronized </label>
                            </p>
    <p>
<input type="radio" name="$RadioGroup" value="4" class="radio"> <label>
Stonesoft Mobile Text </label>
                            </p>
    <p>
<input type="radio" name="$RadioGroup" value="5" class="radio"> <label>
Stonesoft Password </label>
                            </p>
    <p>
<input type="radio" name="$RadioGroup" value="6" class="radio"> <label>
General RADIUS </label>
                            </p>
    <p>
<input type="radio" name="$RadioGroup" value="7" class="radio"> <label>
SecurID </label>
                            </p>
    <p>
<input type="radio" name="$RadioGroup" value="8" class="radio"> <label>
SafeWord </label>
                            </p>
    <p>
<input type="radio" name="$RadioGroup" value="9" class="radio"> <label>
LDAP </label>
                            </p>
    <p>
<input type="radio" name="$RadioGroup" value="10" class="radio"> <label>
Active Directory </label>
                            </p>
    <p>
<input type="radio" name="$RadioGroup" value="11" class="radio"> <label>
IBM Tivoli </label>
                            </p>
    <p>
<input type="radio" name="$RadioGroup" value="12" class="radio"> <label>
IBM RACF </label>
                            </p>
    <p>
<input type="radio" name="$RadioGroup" value="13" class="radio"> <label>
Novell eDirectory </label>
                            </p>
    <p>
<input type="radio" name="$RadioGroup" value="14" class="radio"> <label>
Windows Integrated Login </label>
                            </p>
    <p>
<input type="radio" name="$RadioGroup" value="15" class="radio"> <label>
NTLM </label>
                            </p>
    <p>
<input type="radio" name="$RadioGroup" value="16" class="radio"> <label>
Basic </label>
                            </p>
    <p>
<input type="radio" name="$RadioGroup" value="17" class="radio"> <label>
User Certificate </label>
                            </p>
    <p>
<input type="radio" name="$RadioGroup" value="18" class="radio"> <label>
Extended User Bind </label>
                            </p>
    <p>
<input type="radio" name="$RadioGroup" value="19" class="radio"> <label>
Form-Based Authentication </label>
                            </p>
    <p>
<input type="radio" name="$RadioGroup" value="20" class="radio"> <label>
E-ID </label>
                            </p>
    <p>
<input type="radio" name="$RadioGroup" value="21" class="radio"> <label>
E-ID Signer </label>
                            </p>
    </div>
как вариант я вытягиваю значение из DOM с помощью регулярки и узнаю значение Value
но хотелось бы разобраться как это можно сделать с помощью sibling на c#
 
Последнее редактирование:

VladZen

Administrator
Команда форума
Регистрация
05.11.2014
Сообщения
22 453
Благодарностей
5 913
Баллы
113
sibling же с XML работает...
 

Master Woo

Client
Регистрация
06.12.2014
Сообщения
122
Благодарностей
129
Баллы
43
а еще как нибудь можно найти элемент зная его дочерний?
 

VladZen

Administrator
Команда форума
Регистрация
05.11.2014
Сообщения
22 453
Благодарностей
5 913
Баллы
113

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
как вариант я вытягиваю значение из DOM с помощью регулярки и узнаю значение Value
но хотелось бы разобраться как это можно сделать с помощью sibling на c#
Если решение, причем, довольно короткое, уже найдено, то зачем мудрить дальше?
 

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
Не знаю правильно ли я понял, что надо сделать ТС.
Предложу свой вариант.

С помощью метода FindElementsByAttribute, у которого в качестве параметра поиска регулярка, получаем коллекцию html элементов, у которых внешний тег это <p>, а внутри как раз два дочерних тега <input> и <label>.
Код:
var elem = instance.ActiveTab.GetDocumentByAddress("0").FindElementsByAttribute("p", "innertext", "\\r\\n", "regexp");

Потом из этой коллекции элементов создаем словарь, у которого в качестве ключа будет то, что находится между тегами <label></label>, а в качестве значения html элемент <input>.
Код:
var dic = elem.Elements.ToDictionary(e => e.GetChildren(false).Elements[1].InnerHtml.Trim(), e => e.GetChildren(false).Elements[0]);

А дальше можно делать что надо.
Например эмулировать нажатие на какой либо элемент.
Код:
dic["SecurID"].Click();

Или получить значение атрибута value у тега <input>.
Код:
dic["SecurID"].GetAttribute("Value")

 
  • Спасибо
Реакции: Master Woo

Master Woo

Client
Регистрация
06.12.2014
Сообщения
122
Благодарностей
129
Баллы
43
Не знаю правильно ли я понял, что надо сделать ТС.
Предложу свой вариант.

С помощью метода FindElementsByAttribute, у которого в качестве параметра поиска регулярка, получаем коллекцию html элементов, у которых внешний тег это <p>, а внутри как раз два дочерних тега <input> и <label>.
Код:
var elem = instance.ActiveTab.GetDocumentByAddress("0").FindElementsByAttribute("p", "innertext", "\\r\\n", "regexp");

Потом из этой коллекции элементов создаем словарь, у которого в качестве ключа будет то, что находится между тегами <label></label>, а в качестве значения html элемент <input>.
Код:
var dic = elem.Elements.ToDictionary(e => e.GetChildren(false).Elements[1].InnerHtml.Trim(), e => e.GetChildren(false).Elements[0]);

А дальше можно делать что надо.
Например эмулировать нажатие на какой либо элемент.
Код:
dic["SecurID"].Click();

Или получить значение атрибута value у тега <input>.
Код:
dic["SecurID"].GetAttribute("Value")

спасибо, то что нужно
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)