如何使用Selenium定位Angular的_ngcontent动态属性元素(Python)
解决Selenium定位Angular _ngcontent属性元素的问题
第一步:定位所有目标span元素
Angular生成的_ngcontent-xxx-c324是样式隔离用的属性,你之前的代码错误匹配了文本内容,正确做法是通过XPath捕获属性名以_ngcontent-开头的span元素:
elements = drv.find_elements(By.XPATH, '//span[starts-with(name(), "_ngcontent-")]')
这个XPath会命中所有带_ngcontent-xxx-c324类属性的span,不管中间动态变化的xxx部分是什么。
第二步:按_ngcontent属性分组文本
用字典按属性名分组存储对应文本,核心是提取每个元素的_ngcontent-xxx-c324属性名作为分组键:
from collections import defaultdict # 初始化分组容器 grouped_texts = defaultdict(list) for elem in elements: # 遍历元素属性,找到_ngcontent开头的属性名 ng_attr_name = None for attr in elem.get_property('attributes'): if attr['name'].startswith('_ngcontent-'): ng_attr_name = attr['name'] break # 将非空文本加入对应分组 if ng_attr_name and elem.text.strip(): grouped_texts[ng_attr_name].append(elem.text.strip()) # 输出分组结果 for attr_key, text_list in grouped_texts.items(): print(f"[{attr_key}] 对应的文本列表:") for text in text_list: print(f" - {text}")
关键细节
- 不要硬编码完整的
_ngcontent-xxx-c324属性名,xxx是会话动态生成的,每次登录都会变化,用starts-with和遍历属性的方式能适配所有场景。 - 用
defaultdict可以自动处理新分组的创建,避免手动判断键是否存在。 - 过滤空文本,避免分组里出现无效内容。
内容的提问来源于stack exchange,提问作者Guy Tech
相关产品推荐
相关产品推荐

