【问题标题】:Selenium dynamic id in xpathxpath中的硒动态ID
【发布时间】:2021-04-10 20:08:28
【问题描述】:

我正在尝试通过 xpath 选择来自此站点 https://www.crateandbarrel.ca/lindstrom-48x84-grey-curtain-panel/s557728 的产品

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 发生了变化。

【问题讨论】:

  • @ArundeepChohan 考虑到所有这些嵌套的 DIV 和 SPAN,您有什么希望知道可能会返回什么?如果页面有一点点变化,定位器很可能会损坏。拥有如此通用的 XPath 并不是一个好习惯,更不用说这么长了。

标签: selenium selenium-webdriver


【解决方案1】:

使用这么大的 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)

【讨论】:

  • 你太棒了!非常感谢!!
【解决方案2】:

尝试检查id 几次,但看起来react_ 部分是不可变的。 所以你可以简单地通过部分 id 捕获它:

"//*[contains(@id, "react_")]"

【讨论】:

    【解决方案3】:

    首先,我无法找到您在网站中搜索的元素。

    关于Xpath,您可以像这样使用contains 方法-

    xpath = //*[contains(@id,"react_")]/div/div/div[2]/div[4]/div[1]/div/div[2]/span/span/span

    如果有帮助,请告诉我。

    【讨论】:

    • 我正在尝试选择价格。我看到所有价格都有regPrice 一类。我尝试使用WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CLASS_NAME, 'regPrice'))).text 进行选择,但超时
    • All_Prices = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.CLASS_NAME, 'regPrice'))) 然后循环遍历元素并提取文本。 for price in All_Prices: print(price.text)
    猜你喜欢
    • 1970-01-01
    • 2020-06-29
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多