以下,
<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选择器,是否有更好的替代方案?
答案 0 :(得分:1)
答案 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
。