【问题标题】:How to iterate through svg elements for python [duplicate]如何遍历python的svg元素[重复]
【发布时间】:2020-02-10 12:50:45
【问题描述】:

我一直在尝试遍历页面上具有定义特征的所有 svg 元素,然后单击它们并进行解析,但只发现了如何打开第一个元素 你知道怎么全部打开吗? 任何反馈表示赞赏:)

<tr class="MuiTableRow-root">
  <td class="MuiTableCell-root jss346 MuiTableCell-alignLeft MuiTableCell-sizeSmall MuiTableCell-body">АМАРИЛ М ТАБЛ. П/ПЛЕН/ОБ. 2МГ+500МГ №30</td>
  <td class="MuiTableCell-root jss346 MuiTableCell-alignRight MuiTableCell-sizeSmall MuiTableCell-body">1</td>
  <td class="MuiTableCell-root jss346 MuiTableCell-alignLeft MuiTableCell-sizeSmall MuiTableCell-body"><a class="MuiTypography-root MuiLink-root MuiLink-underlineHover jss348 MuiTypography-colorPrimary"><svg class="MuiSvgIcon-root jss350" focusable="false" viewBox="0 0 24 24" aria-hidden="true" role="presentation"><path d="M18 17H6v-2h12v2zm0-4H6v-2h12v2zm0-4H6V7h12v2zM3 22l1.5-1.5L6 22l1.5-1.5L9 22l1.5-1.5L12 22l1.5-1.5L15 22l1.5-1.5L18 22l1.5-1.5L21 22V2l-1.5 1.5L18 2l-1.5 1.5L15 2l-1.5 1.5L12 2l-1.5 1.5L9 2 7.5 3.5 6 2 4.5 3.5 3 2v20z"></path></svg></a></td>
</tr>
<tr class="MuiTableRow-root">
  <td class="MuiTableCell-root jss346 MuiTableCell-alignLeft MuiTableCell-sizeSmall MuiTableCell-body">АМАРИЛ М ТАБЛ. П/ПЛЕН/ОБ. 2МГ+500МГ №30</td>
  <td class="MuiTableCell-root jss346 MuiTableCell-alignRight MuiTableCell-sizeSmall MuiTableCell-body">1</td>
  <td class="MuiTableCell-root jss346 MuiTableCell-alignLeft MuiTableCell-sizeSmall MuiTableCell-body"><a class="MuiTypography-root MuiLink-root MuiLink-underlineHover jss348 MuiTypography-colorPrimary"><svg class="MuiSvgIcon-root jss350" focusable="false" viewBox="0 0 24 24" aria-hidden="true" role="presentation"><path d="M18 17H6v-2h12v2zm0-4H6v-2h12v2zm0-4H6V7h12v2zM3 22l1.5-1.5L6 22l1.5-1.5L9 22l1.5-1.5L12 22l1.5-1.5L15 22l1.5-1.5L18 22l1.5-1.5L21 22V2l-1.5 1.5L18 2l-1.5 1.5L15 2l-1.5 1.5L12 2l-1.5 1.5L9 2 7.5 3.5 6 2 4.5 3.5 3 2v20z"></path></svg></a></td>
</tr>

等等……

我的代码:

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("start-maximized")
driver = webdriver.Chrome(options=chrome_options)
driver.get(url)
XPATH = "//*[name()='svg' and contains(@class, 'jss350')]"
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//*[name()='svg' and contains(@class, 'jss350')]"))).click()
driver.quit()

【问题讨论】:

    标签: python selenium svg


    【解决方案1】:

    您似乎在这里错误地使用了XPath —— 查询@name='svg' 将获得具有name 属性svg 的元素,而不是svg 类型的WebElements。

    如果您想等待所有 svg 元素存在,您可以这样做:

    WebDriverWait(driver, 20).until(EC.presence_of_all_elements_located((By.XPATH, "//svg[contains(@class, 'jss350')]")))
    

    但是,您还希望遍历列表中的元素。您需要先找到所有元素,然后对其进行迭代。你可以试试下面的代码:

    # Wait for all svg elements to be clickable
    WebDriverWait(driver, 20).until(EC.presence_of_all_elements_located((By.XPATH, "//svg[contains(@class, 'jss350')]")))
    
    # find list of svg elements
    svg_elements = driver.find_elements_by_xpath("//svg[contains(@class, 'jss350')]")
    
    # iterate the list and click each one
    for element in svg_elements:
        element.click()
    

    这将等待所有svg 元素存在,从页面中获取元素列表,迭代每个元素,然后单击它。

    【讨论】:

    • 感谢您的建议。我试图执行你的代码,但结果 svg_elements 是空列表,WebDriverWait 因 TimeoutException 而崩溃,没有消息
    • 我使用了我的 XPATH 字符串和您的代码与元素迭代,它的工作完美。然后我遇到了一个新的挑战——如何点击新的内部(同一页面)窗口。为了您的理解,我单击元素,打开窗口,获取元素列表,然后想要关闭此窗口。你知道怎么处理吗?
    猜你喜欢
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    • 2019-10-06
    • 2019-05-14
    • 2019-12-24
    • 2021-07-31
    • 2020-02-14
    • 1970-01-01
    相关资源
    最近更新 更多