Selenium 获取元素 CSS 选择器问题:索引值错误及解决方法
这段代码可以正确获取元素的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选择器,并且索引值应该是正确的。
原文地址: https://www.cveoy.top/t/topic/o97k 著作权归作者所有。请勿转载和采集!