在python selenium中使用父/同级查找元素

2024-05-26 04:24:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我在python中使用selenium来抓取一个用angular js设计的网页,因此对于id等元素没有健壮的标识符。我完全依赖CSS选择器(动态的)和XPath

我有以下代码-

<div class="dpm-form-row ng-star-inserted">
<dpm-input-number class="flex-6">
<dpm-input-label>
<label>Fixed Rate</label>
</dpm-input-label>
<dpm-input-number-bare>
<input size="1" type="text" placeholder="" class="ng-pristine ng-valid ng-touched">
</dpm-input-number-bare>
</dpm-input-number>
<div class="flex-6">
</div>
</div>

它基本上是一个名为“固定利率”的标签,后跟一个输入文本框。我想抓住的就是那个盒子

我已使用以下代码成功获取标签,但在使用父/同级逻辑获取框时遇到问题-

element = driver.find_element_by_xpath('//*[contains(text(),"Fixed Rate")]')

Tags: 代码textdivnumberinputrate标签element
1条回答
网友
1楼 · 发布于 2024-05-26 04:24:07

从你的preceding问题发回。原始解决方案:

//input[@class="ng-pristine ng-valid ng-touched"][../preceding-sibling::dpm-input-label[1]/label[.="Fixed Rate"]]

3使用following-sibling轴的XPath:

//dpm-input-label[label[.="Fixed Rate"]]/following-sibling::dpm-input-number-bare[1]/input
//dpm-input-label[label[contains(.,"Fixed Rate")]]/following-sibling::dpm-input-number-bare[1]/input
//dpm-input-label[contains(.,"Fixed Rate")]/following-sibling::dpm-input-number-bare[1]/input

3对input元素使用preceding-sibling轴和多个contains的XPath:

//input[contains(@class,"ng-pristine") and contains(@class,"ng-valid") and contains(@class,"ng-touched")][../preceding-sibling::dpm-input-label[1]/label[.="Fixed Rate"]]
//input[contains(@class,"ng-pristine") and contains(@class,"ng-valid") and contains(@class,"ng-touched")][../preceding-sibling::dpm-input-label[1]/label[contains(.,"Fixed Rate")]]
//input[contains(@class,"ng-pristine") and contains(@class,"ng-valid") and contains(@class,"ng-touched")][../preceding-sibling::dpm-input-label[1][contains(.,"Fixed Rate")]]

4使用preceding轴的XPath:

//input[@class="ng-pristine ng-valid ng-touched"][preceding::label[1][.="Fixed Rate"]]
//input[@class="ng-pristine ng-valid ng-touched"][preceding::label[1][contains(.,"Fixed Rate")]]
//input[contains(@class,"ng-pristine") and contains(@class,"ng-valid") and contains(@class,"ng-touched")][preceding::label[1][.="Fixed Rate"]]
//input[contains(@class,"ng-pristine") and contains(@class,"ng-valid") and contains(@class,"ng-touched")][preceding::label[1][contains(.,"Fixed Rate")]]

相关问题 更多 >