[英]Selenium dynamic id in xpath
我正在嘗試 select 由 xpath 對本網站https://www.crateandbarrel.ca/lindstrom-panel-48/x854-7
xpath 看起來像這樣//*[@id="react_0HM7S1A7EGQ26"]/div/div/div[2]/div[4]/div[1]/div/div[2]/span/span/span
和 CSS像這樣的選擇器#react_0HM7S1A7EGQ26 > div > div > div.product-row.full-width > div.right-col > div.hidden-xs > div > div.shop-bar-price-area.jsProductPrice > span > span > span
react_0HM7S1A7EGQ26
部分在許多產品上都不同,我正在尋找一種方法來處理這個問題。
目前我正在做這樣的事情:
xpath = '//*[@id="react_0HM7S1A7EGQ26"]/div/div/div[2]/div[4]/div[1]/div/div[2]/span/span/span'
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, xpath))).text
但是這個 xpath 不能用於所有產品,因為0HM7S1A7EGQ26
發生了變化。
使用這么大的 XPath 或 CSS 選擇器真的不是一個好主意。 如果站點發生變化,定位器越大,定位器損壞的可能性就越大。
看起來您正在嘗試獲取價格
<div class="shop-bar-price-area jsProductPrice">
<span>
<span class="reg">
<span class="regPrice">CAD 74.95</span>
</span>
</span>
</div>
您可以使用簡單的 CSS 選擇器span.regPrice
獲取價格。 問題是由於某種原因,頁面上有大量的價格......除了一個之外,所有這些都是隱藏的。 因此,為了解決這個問題,我們可以添加代碼以使用該定位器並過濾到僅可見的價格。
prices = driver.find_elements_by_css_selector("span.regPrice")
displayed_price = list(filter(lambda x: x.is_displayed(), prices))
print(displayed_price.text)
如果您不想使用所有這些,從我檢查提供的頁面來看,可見價格始終是第二個元素。 你可以試試這個,看看它是否適用於你關心的所有產品。
prices = driver.find_elements_by_css_selector("span.regPrice")
print(prices[1].text)
嘗試檢查id
幾次,但看起來react_
部分是不可變的。 所以你可以簡單地通過部分 id 捕獲它:
"//*[contains(@id, "react_")]"
首先,我無法找到您在網站中搜索的元素。
關於Xpath
您可以使用contains
這樣的方法 -
xpath = //*[contains(@id,"react_")]/div/div/div[2]/div[4]/div[1]/div/div[2]/span/span/span
如果有幫助,請告訴我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.