首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python Selenium -在这种情况下(输入框)捕获元素(Xpath或CSS选择器)的最佳方式?

Python Selenium -在这种情况下(输入框)捕获元素(Xpath或CSS选择器)的最佳方式?
EN

Stack Overflow用户
提问于 2020-07-24 04:18:21
回答 4查看 227关注 0票数 1

我正在尝试用selenium抓取一个网站,我主要使用xpath或CSS选择器来抓取元素。然而,我注意到这些是动态的(即使我在网上读到CSS选择器不应该是动态的),我不得不经常重写代码。我对此还是个新手,我想帮助你找出最好的方法。下面是一个我试图获取的输入框的元素示例,我知道像ID这样的更明确的选择器使用起来更健壮,但在这种情况下我似乎找不到任何标识符。以下元素-

代码语言:javascript
复制
<dpm-input-number-bare><input size="1" type="text" placeholder="" class="ng-pristine ng-valid ng-touched"></dpm-input-number-bare>

这不管用-

代码语言:javascript
复制
driver.find_element_by_css_selector("ng-valid.ng-dirty.ng-touched")

这是更高的级别-它基本上是输入固定利率的输入框(框旁边的标签)

代码语言:javascript
复制
<div class="dpm-form-row"><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>
EN

回答 4

Stack Overflow用户

发布于 2020-07-24 22:30:21

您可以使用以下XPath找到该元素:

代码语言:javascript
复制
driver.find_element_by_xpath('//input[@class="ng-pristine ng-valid ng-touched"][../preceding-sibling::dpm-input-label[1]/label[.="Fixed Rate"]]')

我们使用label元素作为锚点。获取满足以下条件的input元素:其parent的第一个preceding-sibling有一个label子级,其中包含术语"Fixed Rate“。

如果需要,添加一个预期的条件(元素可以接收到点击)。假设您想在输入框中发送"12“:

代码语言:javascript
复制
WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.XPATH, '//input[@class="ng-pristine ng-valid ng-touched"][../preceding-sibling::dpm-input-label[1]/label[.="Fixed Rate"]]'))).send_keys("12")

导入:

代码语言:javascript
复制
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

编辑:其他XPath替代方案:

3使用following-sibling轴的XPath:

代码语言:javascript
复制
//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轴和input元素的多个contains

代码语言:javascript
复制
//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:

代码语言:javascript
复制
//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")]]
票数 1
EN

Stack Overflow用户

发布于 2020-07-24 04:51:54

你试过这个吗?

代码语言:javascript
复制
driver.find_element_by_xpath('//input[@type="text"]')

但是,如果同一XPath中有多个元素,则可能会引发错误。

票数 0
EN

Stack Overflow用户

发布于 2020-07-24 22:35:32

如何使用元素的类来查找元素

代码语言:javascript
复制
driver.find_element_by_class_name('ng-pristine ng-valid ng-touched')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63062499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档