亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在這種情況下(輸入框)捕獲元素(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 關注
  • 210 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號