是的,这段代码可以正确获取元素的 CSS 选择器。它使用了元素的标签名称、属性和父元素的信息来构建 CSS 选择器,并通过循环向上查找父元素,直到找到与子元素相同的属性为止。

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, '..')

    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
        try:
            parent = parent.find_element(By.XPATH, '..')
        except:
            return css_selector

    return css_selector

这段代码通过以下步骤来获取元素的 CSS 选择器:

  1. 获取元素的标签名称和属性:使用 element.tag_nameelement.get_attribute('outerHTML') 获取元素的标签名称和属性信息。
  2. 生成初始 CSS 选择器:使用元素的标签名称作为初始 CSS 选择器。
  3. 循环向上查找父元素:使用 parent.find_element(By.XPATH, '..') 获取父元素,并判断父元素是否包含当前元素。
  4. 构建父元素的 CSS 选择器:如果父元素包含当前元素,则使用 :nth-child() 伪类来指定元素在父元素中的位置。否则,直接使用父元素的标签名称作为选择器。
  5. 比较父元素和子元素的属性:如果父元素的属性与子元素相同,则不再向上查找。
  6. 返回最终 CSS 选择器:当循环结束时,返回构建好的 CSS 选择器。

使用这段代码可以方便地获取网页元素的 CSS 选择器,并利用伪类 (nth-child) 提高选择器准确性。

Python Selenium 获取元素 CSS 选择器 (含伪类)

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

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