【问题标题】:Find element using parent/sibling in python selenium在 python selenium 中使用父/兄弟查找元素
【发布时间】:2020-11-15 06:07:20
【问题描述】:

我在 python 中使用 selenium 来抓取一个用 angular js 设计的网页,因此没有可靠的标识符来识别 id 等元素。我完全依赖 CSS 选择器(它们是动态的)和 xpaths。

我有以下代码-

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

它基本上是一个名为“Fixed Rate”的标签,后跟一个输入文本框。它是我想要抓住的那个盒子。

我已设法使用以下代码获取标签,但在使用父/兄弟逻辑获取框时遇到问题 -

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

【问题讨论】:

  • 您可以通过检查元素来复制输入元素的xpath。
  • 浏览器不将 jsx 或任何 Angular 用于 html 吗?

标签: python css selenium xpath web-scraping


【解决方案1】:

从您的preceding 问题重新发布。原始解决方案:

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

3 XPath 使用following-sibling 轴:

//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 XPath 使用preceding-sibling 轴和多个contains 用于input 元素:

//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 XPath 使用preceding 轴:

//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")]]

【讨论】:

  • 谢谢vm,由于某种原因,原来的解决方案不起作用,再次感谢
  • 您的答案真的很有帮助,特别是您在答案中提供的选项。
猜你喜欢
  • 1970-01-01
  • 2014-07-16
  • 2016-08-14
  • 1970-01-01
  • 2021-07-18
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多