【问题标题】:Selenium : Get a div that contains a specific div class inside itSelenium:获取一个 div,其中包含一个特定的 div 类
【发布时间】:2022-07-06 02:29:43
【问题描述】:

我有一个页面结构,其中包含分配给多个 div 的类名。但是有一个特定的 div 将在其中包含一个特定的 div.class 动态发生。

<div class="ProductVariants__VariantCard-sc-1unev4j-3 bEuNss">
   <div class="ProductVariants__RadioButtonContainer-sc-1unev4j-4 jqJIBg">
     <div class="ProductVariants__RadioButtonOuter-sc-1unev4j-5 jcgpFW">
       <div class="ProductVariants__RadioButtonInner-sc-1unev4j-6 fgFqYM">
       </div>
     </div>
   </div>
   <div class="ProductVariants__VariantDetailsContainer-sc-1unev4j-7 fvkqJd">
     <p class="ProductVariants__VariantUnitText-sc-1unev4j-8 bZvIga">50 g</p>
     <div class="ProductVariants__PriceContainer-sc-1unev4j-9 jjiIua">
       ₹111 
       <span class="ProductVariants__MRPText-sc-1unev4j-10 jEinXG">
         ₹345
       </span>
     </div>
   </div>
</div>

如果您在此处看到此类 ProductVariants__RadioButtonInner-sc-1unev4j-6 fgFqYM 第 4 行将包含在该特定类中。虽然可能有多个ProductVariants__VariantCard-sc-1unev4j-3 bEuNss

如何获得包含ProductVariants__RadioButtonInner-sc-1unev4j-6 fgFqYM 的类ProductVariants__VariantCard-sc-1unev4j-3 bEuNss

这是我尝试过的

driver.find_element(by=By.XPATH, value="//div[contains(@class,'ProductVariants__VariantCard-sc-1unev4j-3 bEuNss')]//div[contains(@class, 'ProductVariants__RadioButtonInner-sc-1unev4j-6 fgFqYM')]")

但这反而给了我内部 div 而不是整个外部 div

'<div class="ProductVariants__RadioButtonInner-sc-1unev4j-6 fgFqYM"></div>'

【问题讨论】:

  • 代码示例中的 XPath 与异常中的 XPath 不匹配。更新您的问题
  • fgFqYM 嵌套在第三层。所以你可以找到这个 div 并找到向上三层的父级。例如。 driver.execute_script("return document.querySelector('.ProductVariants__RadioButtonInner-sc-1unev4j-6.fgFqYM').parentNode.parentNode.parentNode;")。如果嵌套顺序发生变化,这将中断。
  • @JaSON 更新了我的问题
  • @Firelord 没有更硒的方式,我不想执行任何 JS
  • @HimanshuPoddar 我不知道 xpath,所以我建议了替代方案。虽然,这不是一个很好的方法,但我可以将整个 HTML 正文引用从 selenium 传递给 Beautifulsoup,并使用 Python 从那里获取父级或祖先。不需要 JS。

标签: python selenium selenium-webdriver selenium-chromedriver findelement


【解决方案1】:

要使用 class="ProductVariants__VariantCard-sc-1unev4j-3 bEuNss 来识别 &lt;div&gt;class="ProductVariants__RadioButtonInner-sc-1unev4j-6 fgFqYM&lt;div&gt;,您可以使用以下 Locator Strategy

driver.find_element(by=By.XPATH, value="//div[starts-with(@class, 'ProductVariants__RadioButtonInner')]//ancestor::div[starts-with(@class, 'ProductVariants__VariantCard')]")

【讨论】:

    【解决方案2】:

    如果要选择包含特定后代节点的祖先节点尝试

    driver.find_element(by=By.XPATH, value="//div[contains(@class,'ProductVariants__VariantCard-sc-1unev4j-3 bEuNss') and .//div[contains(@class, 'ProductVariants__RadioButtonInner-sc-1unev4j-6 fgFqYM')]]")
    

    【讨论】:

    • div_containing_radio = driver.find_element(by=By.XPATH, value="//div[contains(@class,'ProductVariants__VariantCard-sc-1unev4j-3 bEuNss') and .//div[contains(@class, 'ProductVariants__RadioButtonInner-sc-1unev4j-6 fgFqYM')]]") 如果我使用您的代码,现在如果我尝试在div_containing_radio.find_element(by=By.CLASS_NAME, value="ProductVariants__PriceContainer-sc-1unev4j-9 jjiIua") 中获取类ProductVariants__PriceContainer-sc-1unev4j-9 jjiIua,则会出现错误selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多