这段代码可以正确获取元素的CSS选择器,但是在处理父元素时可能会出现问题。

在循环中,代码通过 element.find_element(By.XPATH, "..") 获取父元素。然而,这种方法在处理某些特殊情况时可能会导致错误的结果。

一个更可靠的方法是使用 element.find_element(By.XPATH, "parent::*") 获取父元素。这样可以确保获取到正确的父元素。

另外,关于索引值为什么会达到 367 的问题,可能是因为在父元素中存在多个相同类型的子元素,并且它们的位置不同。这样会导致索引值增加。

为了正确获取索引值,可以使用 element.location 方法获取元素在页面中的位置,再与其他相同类型的子元素进行比较。

以下是修改后的代码示例:

from selenium.webdriver.common.by import By

def get_css_selector_with_pseudo(element):
    # 获取元素的标签名称
    tag_name = element.tag_name

    # 获取元素的属性
    attributes = element.get_attribute('outerHTML')

    # 生成 CSS 选择器
    css_selector = f'{tag_name}'
    parent = element.find_element(By.XPATH, 'parent::*')

    while parent is not None:
        # 获取父元素的标签名称
        parent_tag_name = parent.tag_name

        # 获取父元素的所有子元素
        siblings = parent.find_elements(By.CSS_SELECTOR, f'{parent_tag_name}')

        # 确认父元素是否包含当前元素
        if element in siblings:
            parent_index = siblings.index(element)

            # 拼接父元素的 CSS 选择器
            css_selector = f'{parent_tag_name}:nth-child({parent_index + 1}) > {css_selector}'
        else:
            css_selector = f'{parent_tag_name} > {css_selector}'

        # 获取父元素的属性
        parent_attributes = parent.get_attribute('outerHTML')

        # 如果父元素的属性与子元素相同,则不再向上查找
        if parent_attributes == attributes:
            break

        # 继续向上查找父元素
        attributes = parent_attributes
        element = parent
        parent = element.find_element(By.XPATH, 'parent::*')

    return css_selector

使用这个修改后的代码,应该能够正确获取元素的CSS选择器,并且索引值应该是正确的。

Selenium 获取元素 CSS 选择器问题:索引值错误及解决方法

原文地址: https://www.cveoy.top/t/topic/o97k 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录