Python Selenium 获取元素 CSS 选择器 (含伪类)
是的,这段代码可以正确获取元素的 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 选择器:
- 获取元素的标签名称和属性:使用
element.tag_name和element.get_attribute('outerHTML')获取元素的标签名称和属性信息。 - 生成初始 CSS 选择器:使用元素的标签名称作为初始 CSS 选择器。
- 循环向上查找父元素:使用
parent.find_element(By.XPATH, '..')获取父元素,并判断父元素是否包含当前元素。 - 构建父元素的 CSS 选择器:如果父元素包含当前元素,则使用
:nth-child()伪类来指定元素在父元素中的位置。否则,直接使用父元素的标签名称作为选择器。 - 比较父元素和子元素的属性:如果父元素的属性与子元素相同,则不再向上查找。
- 返回最终 CSS 选择器:当循环结束时,返回构建好的 CSS 选择器。
使用这段代码可以方便地获取网页元素的 CSS 选择器,并利用伪类 (nth-child) 提高选择器准确性。
原文地址: https://www.cveoy.top/t/topic/o96k 著作权归作者所有。请勿转载和采集!