簡體   English   中英

xpath 中的 Selenium 動態 id

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM