首页 > 解决方案 > 使用 Selenium 和 Python 从 svg 标签中的 g 标签获取文本

问题描述

我正在尝试使用 selenium 从类标签中获取文本,但我有点走到了死胡同。所有类名都是相同的“legend-row”,但我只需要第三个,即具有“1.09TB”文本的那个。

我试图通过 xpath 找到元素,但没有运气,我设法从这些类中获取值的唯一方法是使用下面的代码行

driver.find_element_by_class_name("legend-row").text

这让我得到了所有的文本,134.46Tb、8.96TB、1.09TB 和 90% 的阈值。有什么办法只能查询第三个吗?请参阅以下 URL 中的类

<g class="legend" style="font-size: 14px;">
    <g class="legend-row" transform="translate(102,-32.400000000000006)">
        <rect y="-30.599999999999998" width="14" height="14" style="fill: rgb(125, 123, 140); stroke: rgb(125, 123, 140);"/>
        <text x="18" y="-18">Allocated:</text>
        <text x="109.421875" y="-18"> 134.46 TB</text>
    </g>
    <g class="legend-row" transform="translate(102,-10.800000000000004)">
        <rect y="-30.599999999999998" width="14" height="14" style="fill: rgb(110, 37, 133); stroke: rgb(110, 37, 133);"/>
        <text x="18" y="-18">Spare:</text>
        <text x="109.421875" y="-18"> 8.96 TB</text>
    </g>
    <g class="legend-row" transform="translate(102,10.799999999999997)">
        <rect y="-30.599999999999998" width="14" height="14" style="fill: rgb(130, 224, 170); stroke: rgb(130, 224, 170);"/>
        <text x="18" y="-18">Unallocated:</text>
        <text x="109.421875" y="-18"> 1.09 TB</text>
    </g>
    <g class="legend-th-row" transform="translate(102,32.39999999999999)">
        <text x="0" y="0" class="chart-status-icon" style="font-size: 14px; fill: rgb(242, 175, 0);">&lt;/text>
        <text x="18" y="0">Threshold Level: 90%</text>
    </g>
</g>

谢谢您的帮助,

标签: pythonseleniumsvgxpathcss-selectors

解决方案


要打印文本 1.09 TB,您必须诱导WebDriverWait并且visibility_of_element_located()您可以使用以下任一Locator Strategies

  • 使用XPATH文本属性:

    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//dui-donut-chart/*[name()='svg']/*[name()='g']/*[name()='g']//*[name()='g']//text[., 'Unallocated:']//following::text[1]"))).text)
    
  • 使用CSS_SELECTORget_attribute()

    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "dui-donut-chart>svg>g>g g:nth-of-type(3) text:nth-of-type(2)"))).get_attribute("innerHTML"))
    
  • 注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

参考

您可以在以下位置找到一些相关的讨论:


推荐阅读