2013-02-25 75 views
0

我有一些关于硒RC xpath的问题。我已经做了一些xpath字符串来匹配某些字段,无论id(全部是自动生成的)。Selenium RC xpath与firefox/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元素不能包含样式显示:none ;.

当我在firefox或xpath可视化器中测试xpath时,一切似乎都没有问题。

我的Selenium代码虽然由于某种原因返回隐藏的元素。 (返回最后一个匹配元素,对于他来说隐藏的元素是一个匹配)。我不知道是什么原因。能再给它一些亮光吗?

另外这是我的Selenium代码。

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; 
     } 

回答

0

这是一个非常可怕的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'] 
+0

呀XPath是可怕的,我知道,但不能找到一个更好的。您发布的内容并不奏效,因为它旨在挑选错误的元素。 TD的跨度和实际数据是兄弟姐妹,不像你设计的父母和孩子。您的评论虽然对我来说足够有帮助,但找到了解决方案// tr [not(contains(@ style,'display:none'))]/td/span [text()='Wykonajakcję'] // parent :: * //下面的兄弟姐妹:: * /选择[不(包含(@禁用,'禁用'))]感谢您的帮助! :) – Shuffler 2013-02-26 15:10:45

+0

我仍然有以下xpath的问题。在firefox firePath中,禁用的元素未被选中,但在Selenium中禁用的值仍然可以更改。任何原因可能是什么原因? – Shuffler 2013-02-27 09:11:25

+0

对不起,我再次测试它,我仍然无法正常工作。它适用于firefox firepath和可视化器,但不能作为硒定位器。我会选择所需的跨度文本而不是未隐藏的文本。 – Shuffler 2013-02-27 16:02:57