У меня есть вопрос относительно того, как selenium RC xpath. Я сделал некоторую строку xpath для соответствия определенным полям независимо от идентификаторов (все они генерируются автоматически).
Мой Xpath соответствует элементу в таблице с определенными условиями. Вот мой html-код
<table style="width:900px;">
<tbody>
<tr>
<td colspan="2">
<span class="header" id="ctl00_ContentPlaceHolder_ctl07">Nowy wniosek </span>
<span class="description" id="ctl00_ContentPlaceHolder_ctl08"></span>
<span></span>
</td>
</tr>
<tr>
<td width="34%" valign="top" bgcolor="#ffffc7">
<span>Status wniosku</span>
<span></span>
</td>
<td width="66%" bgcolor="#ffffc7">
<input type="text" scriptattrib="scriptAttribstring" class="baseCtrl" id="ctl00_ContentPlaceHolder_1020" readonly="readonly" value="Nowy wniosek" name="ctl00$ContentPlaceHolder$1020"/>
<span> </span>
<span class="ctrlDescrpt">(Pole nie do edycji)</span>
<span> </span>
<span style="display:none;" class="validation" id="ctl00_ContentPlaceHolder_ctl21"></span>
<span></span>
</td>
</tr>
<tr>
<td width="34%" valign="top">
<span>Wykonaj akcję</span>
<span></span>
</td>
<td width="66%">
<select class="baseCtrl" id="ctl00_ContentPlaceHolder_1021" name="ctl00$ContentPlaceHolder$1021">
<option value="save">zapisz</option>
<option value="send">wyślij do przełożonego</option>
<option value="cancel">anuluj</option>
</select>
<span> </span>
<span style="display:none;" class="validation" id="ctl00_ContentPlaceHolder_ctl32"></span>
<span></span>
</td>
</tr>
<tr style="display: none;">
<td width="34%" valign="top" bgcolor="#ffffc7">
<span>Wykonaj akcję</span>
<span></span>
</td>
<td width="66%" bgcolor="#ffffc7">
<select class="baseCtrl" id="ctl00_ContentPlaceHolder_1024" name="ctl00$ContentPlaceHolder$1024">
<option value="save">zapisz</option>
<option value="send2">prześlij dalej(ścieżka oddziały)</option>
</select>
<span> </span>
<span style="display:none;" class="validation" id="ctl00_ContentPlaceHolder_ctl43"></span>
<span></span>
</td>
</tr>
<tr>
<td width="34%" valign="top" bgcolor="#ffffc7">
<span>Uwagi</span>
<span></span>
</td>
<td width="66%" bgcolor="#ffffc7">
<textarea scriptattrib="scriptAttribstring" class="baseCtrl" id="ctl00_ContentPlaceHolder_1022" readonly="readonly" cols="20" rows="5" name="ctl00$ContentPlaceHolder$1022"></textarea>
<span> </span>
<span style="display:none;" class="validation" id="ctl00_ContentPlaceHolder_ctl65"></span>
<span></span>
</td>
</tr>
<tr>
<td colspan="2">
<span></span>
</td>
</tr>
</tbody>
</table>
Вот мой XPath
//span[text()='Wykonaj akcję']/parent::*/parent::*[not(contains(@style,'display: none'))]/child::*/following-sibling::*[not(contains(@style,'display: none'))]//select[not(contains(@disabled,'disabled'))]
Проблема в следующем. Таблицы видны или не видны в зависимости от пользователя, вошедшего в систему, или от какой-либо бизнес-логики. Я попытался сделать так, чтобы элемент таблицы TR не мог содержать стиль display: none;.
Когда я тестирую xpath в firefox или некоторых визуализаторах xpath, кажется, что все в порядке.
Мой код Selenium по какой-то причине возвращает скрытый элемент. (Возвращает последний соответствующий элемент, и для него скрытый элемент является совпадением). Я понятия не имею, в чем может быть причина. Можно ли больше пролить свет на это?
Также это мой Selenium Code.
var localizator = LocalizatorGenerators.SelectOptionLocator(labelName);
var id = selenium.GetAttribute(localizator + "@id");
selenium.SeleniumValidate(value, type, id);
selenium.Select(string.Format("id={0}", id), value);
public static string SelectOptionLocator(string labelName)
{
var xpath =
String.Format(
"//span[text()='{0}']/parent::*/parent::*[not(contains(@style,'display: none;'))]/child::*/following-sibling::*[not(contains(@style,'display: none;'))]//select[not(contains(@disabled,'disabled'))]", labelName);
return xpath;
}