Selenium RC xpath отличается от визуализаторов firefox/xpath?

У меня есть вопрос относительно того, как 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;
        }

person Shuffler    schedule 25.02.2013    source источник


Ответы (1)


Это действительно ужасный локатор XPath. Ваши различные комбинации parent::* и following-sibling::* делают чрезвычайно трудным предсказать, что это будет соответствовать. Но поскольку то, что вы пытаетесь определить, это select id="ctl00_ContentPlaceHolder_1021" без использования его значения id, попробуйте следующее:

//tr[not(contains(@style,'display: none'))]/td/[span[text()='Wykonaj akcję']]/td/select[@disabled != 'disabled']
person Ross Patterson    schedule 25.02.2013
comment
Да, xpath ужасен, и я это знаю, но не могу найти лучшего. Тот, который вы разместили, не работает, потому что он предназначен для выбора неправильных элементов. TD с диапазоном и фактическими данными являются братьями и сестрами, а не такими, как вы разработали родителя и ребенка. Однако ваш комментарий был достаточно полезен для меня, чтобы найти решение, которое //tr[not(contains(@style,'display: none'))]/td/span[text()='Wykonaj akcję']//parent ::*//following-sibling::*/select[not(contains(@disabled,'disabled'))] Спасибо за помощь! :) - person Shuffler; 26.02.2013
comment
У меня все еще есть проблема со следующим xpath. В firefox firePath отключенный элемент не выбран, но в Selenium значение disabled все еще можно изменить. Любая причина, в чем может быть причина? - person Shuffler; 27.02.2013
comment
Извините, я проверил это снова, и я все еще не работаю. Он отлично работает с firepath и визуализаторами firefox, но не как локатор селена. Я всегда выбираю последний элемент с желаемым текстом диапазона, а не тот, который не скрыт. - person Shuffler; 27.02.2013