使用Selenium的find_element(By.CLASS_NAME)触发InvalidSelectorException问题
问题描述
需要定位一个页面刷新后类名会变化的元素,用BeautifulSoup成功查到了该元素的类名,但Selenium抛出InvalidSelectorException异常。该类名确实存在于页面源码中,类名前后有空格但BeautifulSoup未显示,即使手动添加空格后问题依旧。
相关代码如下:
#opening vehicle menu vehicle_menu_parent = soup.find('div', string='ЛЕГКОВЫЕ АВТОМОБИЛИ').parent vehicle_menu_class = '" ' + str(vehicle_menu_parent)[11:50] + ' "' print(vehicle_menu_class) # " x-grid-cell x-grid-cell-gridcolumn-1331 " with open('test.html', 'w', encoding='utf8') as file: file.write(driver.page_source) vehicle_menu = driver.find_element(By.CLASS_NAME, vehicle_menu_class) action.move_to_element(vehicle_menu).double_click().perform() time.sleep(10)
页面源码截图:
解决方案
问题出在这几个核心点:
By.CLASS_NAME的使用限制:你传给By.CLASS_NAME的字符串包含引号、前后空格,还同时传入了多个类名(x-grid-cell和x-grid-cell-gridcolumn-1331),但Selenium的By.CLASS_NAME仅支持单个类名匹配,且不能包含引号、空格这类无关符号。- 错误的类名提取逻辑:通过截取字符串的方式获取类名极易出错,应该直接从BeautifulSoup元素中提取原生的class属性。
修改后的正确代码示例:
# 从BeautifulSoup元素中直接获取class列表 vehicle_menu_parent = soup.find('div', string='ЛЕГКОВЫЕ АВТОМОБИЛИ').parent class_list = vehicle_menu_parent.get('class') # 拼接为CSS选择器格式(多类名用点连接) css_selector = '.'.join(class_list) # 用CSS_SELECTOR定位元素(支持多类名匹配) vehicle_menu = driver.find_element(By.CSS_SELECTOR, css_selector) action.move_to_element(vehicle_menu).double_click().perform() time.sleep(10)
如果其中存在固定不变的类(比如x-grid-cell是稳定的,仅后缀类名随机变化),也可以直接结合文本定位,更简洁可靠:
# 用XPATH结合固定类和文本定位 vehicle_menu = driver.find_element(By.XPATH, '//div[contains(@class, "x-grid-cell") and text()="ЛЕГКОВЫЕ АВТОМОБИЛИ"]') action.move_to_element(vehicle_menu).double_click().perform()
内容的提问来源于stack exchange,提问作者zubodub
相关产品推荐
相关产品推荐

