私が達成しようとしているのは、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) を試してみたい場合は、正常に動作していますが、最初のドロップダウン セレクターのみを変更します。
私が調査したことから、問題はセレン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>
また、想像できるように、ID ではなく xpath を使用する必要があります。助けてくれてありがとう。
解決策: 信じられないかもしれませんが、解決策は非常に単純でしたが、これを理解するのにほぼ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));