Selenium使用select_by_value传字符串变量报InvalidSelectorException如何解决?
异常产生原因
- 核心原因是
readlines()方法读取文件每一行内容时,会保留每行末尾的换行符\n,部分情况下还会携带行首/行尾的多余空格、制表符等隐藏空白字符 - Selenium的
select_by_value方法底层是通过构造option[value="传入值"]格式的CSS选择器定位元素,若传入的字符串携带了换行符等特殊字符,会导致CSS选择器语法非法,直接触发InvalidSelectorException - 直接传入固定字符串不会触发问题,就是因为固定字符串不存在这些隐藏的空白/转义字符
解决方案
方案1:读取文件时直接处理空白字符
修改读取team.txt的代码,对每一行内容执行strip()去除首尾所有空白字符(包括换行符、空格、制表符),同时过滤掉空行,更推荐用with上下文管理器自动管理文件资源:
with open("team.txt",'r') as team: teammates = [line.strip() for line in team if line.strip()]
方案2:调用方法前二次校验处理(双重保险)
在Assignments方法中调用select_by_value前,先对传入的参数做去空白处理:
def Assignments(url,assignto,count): sta = Select(driver.find_element_by_id("bulk_status")) sta.select_by_value('Assigned') sta = Select(driver.find_element_by_id("bulk_assigned_individual")) # 对传入的assignto做去空白处理 processed_assign = str(assignto).strip() sta.select_by_value(processed_assign)
排查调试技巧
如果修改后还是有问题,可以先打印变量的原始内容确认是否存在隐藏字符:
for teammate in teammates: # repr()会把字符串里的转义字符直接显示出来,方便排查 print(repr(teammate)) Assignments(UrlForIssues[1],str(teammate),1)
内容的提问来源于stack exchange,提问作者Himanshu Joshi
相关产品推荐
相关产品推荐

