为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

蝴蝶刀刀 2023-03-30 10:35:41
我正在尝试用 selenium 抓取一个网站,我主要使用 xpath 或 CSS 选择器来抓取元素。但是我注意到这些是动态的(即使我在网上读到 CSS 选择器不应该是动态的)而且我不得不经常重新编写代码。我对此很陌生,想帮助找出最好的方法。下面是一个元素的示例,它是我试图获取的输入框,我知道像 ID 这样的更明确的选择器使用起来更可靠,但在这种情况下我似乎找不到任何标识符。下面的元素 -<dpm-input-number-bare><input size="1" type="text" placeholder="" class="ng-pristine ng-valid ng-touched"></dpm-input-number-bare>这不起作用 -driver.find_element_by_css_selector("ng-valid.ng-dirty.ng-touched")这是更高级别 - 它基本上是一个输入固定利率的输入框(框旁边的标签)<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>
查看完整描述

4 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

您可以使用以下 XPath 定位元素:


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

我们使用label元素作为锚点。获取input满足以下条件的元素:preceding-sibling它的第一个元素parent有一个label包含术语“固定利率”的子元素。


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


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

进口:


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



查看完整回答
反对 回复 2023-03-30
?
侃侃无极

TA贡献2051条经验 获得超10个赞

你试过这个吗?

driver.find_element_by_xpath('//input[@type="text"]')

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


查看完整回答
反对 回复 2023-03-30
?
萧十郎

TA贡献1815条经验 获得超13个赞

使用 xpath 尝试以下方法:

driver.find_element_by_xpath("//div[@class='dpm-form-row' and contains(., 'Fixed Rate')]//input[@class='ng-pristine ng-valid ng-touched']")



查看完整回答
反对 回复 2023-03-30
?
慕妹3242003

TA贡献1824条经验 获得超6个赞

如何使用其类查找元素

driver.find_element_by_class_name('ng-pristine ng-valid ng-touched')


查看完整回答
反对 回复 2023-03-30
  • 4 回答
  • 0 关注
  • 179 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信