我想要完成的是xpath选择的每个元素做一些动作。 准确地说
var localizator = LocalizatorGenerators.SelectOptionLocator(labelName);
decimal totalElements = selenium.GetXpathCount((localizator));
for (int i = 1; i < totalElements + 1; i++)
{
if (selenium.IsElementPresent(string.Format("({0})[{1}]", localizator, i)))
selenium.Select(string.Format("({0})[{1}]", localizator, i), value);
}
问题在于xpath可能因为它并非无足轻重。
//tr[not(contains(@style,'display: none;'))]/td/span[text()='{0}']/parent::*/following-sibling::*//select[not(contains(@disabled,'true'))]
如果我想尝试selenium.Select(localizator,value)它工作正常,但只更改第一个下拉选择器。
从我研究过的问题可能是在selenium xpath中使用开括号()。 尝试在firefox firepath中执行xpath时,一切正常。
这是我的HTML代码的一部分。
<tr><td width="34%" valign="top" bgcolor="#ffffc7"><span>Podejmij decyzję</span><span></span></td><td width="66%" bgcolor="#ffffc7"><div>
<table cellspacing="0" border="1" style="border-collapse:collapse;" id="4162" rules="all" class="gridViewCtrl">
<tbody><tr>
<th scope="col">Produkt</th><th scope="col">Decyzja</th>
</tr><tr>
<td>Ekspres Linia</td><td><select id="ctl00_ContentPlaceHolder_4162_ctl02_DropID" name="ctl00$ContentPlaceHolder$4162$ctl02$DropID">
<option value="1"></option>
<option value="2">Pozytywna</option>
<option value="3">Negatywna</option>
</select><span style="display:none;" class="validation" id="ctl00_ContentPlaceHolder_4162_ctl02_ctl00">Wymagane</span></td>
</tr><tr>
<td>AgroEkspres</td><td><select id="ctl00_ContentPlaceHolder_4162_ctl03_DropID" name="ctl00$ContentPlaceHolder$4162$ctl03$DropID">
<option value="1"></option>
<option value="2">Pozytywna</option>
<option value="3">Negatywna</option>
</select><span style="display:none;" class="validation" id="ctl00_ContentPlaceHolder_4162_ctl03_ctl00">Wymagane</span></td>
</tr>
</tbody></table>
另外,你可能想象我必须使用xpath而不是id。谢谢你的帮助。
解: 信不信由你花了2个小时来解决这个问题,而解决方案非常简单。使用括号,您只需在定位器中明确键入xpath =。
完整解决方案
var localizator = LocalizatorGenerators.SelectOptionLocator(labelName);
var totalElements = selenium.GetXpathCount((localizator));
var anyMatched = false;
for (var i = 1; i <= totalElements; i++)
{
var loc = string.Format("xpath=({0})[{1}]", localizator, i);
var options = selenium.GetSelectOptions(loc);
foreach (var option in options)
{
if (option == value){ selenium.Select(loc, value); anyMatched = true}
}
}
if(!anyMatched) throw new Exception(string.Format("No matching value {0} for label {1}",value,labelName));