Selenium RC C#对于每个匹配的xpath节点DO

时间:2013-02-28 14:14:45

标签: c# xpath selenium rc

我想要完成的是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));

0 个答案:

没有答案