使用selenium xpath或css选择器,如何根据内部元素的文本或当前元素文本获取元素

时间:2018-01-06 00:53:38

标签: css selenium selenium-webdriver

以下,

<section id="section2" class="MightChange1 MightChange2">
   <div id="dynamicIdxxx" class="dynamic1 dynamic2 dynamic3">
     <div id="againDynamic" ..>
         <div id="someDynamicCanBeRelayed" class="xyz">
         <button id="dynmaicBtnxx" class="Cannot be relayed">
             <span ....>
                  <span id="dynamic23" class="PartOfDoesntChange">
                       <bdi> show INTEGER more details</bdi>

如何使用bdi文本(INTEGER更改)选择范围(id = dynamic23)。

我可以写下面的内容 // * [@ id ='section2'] // span / bdi [contains(text(),'more fields')] / ancestor :: button“)

挑战是,有时低于

<span id="dynamic23" class="PartOfDoesntChange">
     <bdi> show INTEGER more details</bdi>

将更改为(不带bdi标签)

<span id="dynamic23" class="PartOfDoesntChange"> show INTEGER more details <span>

要处理的一个选项是我可以使用两个xpath使用和不使用bdi使用selenium OR条件。无论哪种方式,我都会得到结果并使用该元素。

对于此类场景或使用css选择器,是否有更好的替代方案?

4 个答案:

答案 0 :(得分:1)

尝试这个简单的//span[contains(., 'show INTEGER more details')],不要替换。到text(),否则它只匹配一个元素

enter image description here

答案 1 :(得分:0)

您可以使用UNION运算符|。请参阅下面的示例。

//*[@id='section2']//span/bdi[contains(text(),'more fields')]/ancestor::button") | //*[@id='section2']//span[contains(text(),'more details')]/ancestor::button")

答案 2 :(得分:0)

要使用文字 show INTEGER more details 选择范围元素,您可以使用以下xpath

//button[@id='dynmaicBtnxx']//*[contains(.,'show INTEGER more details')]//preceding::span[1]
  

注意:似乎值是动态的,因此您可能还必须为元素引入 WebDriverWait

答案 3 :(得分:0)

这可能会有所帮助:

.//*[contains(., 'show INTEGER more details')]/ancestor::button[starts-with(@id,'dynmaicBtn')]

开头的*(星标)会选择包含所需文字的标记,无论是span还是bdi。祖先会选择一个标识为starts-with您的文字的按钮,然后更改int's