Selenium报Unable to locate element需点击新窗口才生效如何解决
问题解决方法
首先明确你现有代码的两个核心错误,是触发报错的主要原因:
- 错误1:
find_element_by_class_name()方法仅支持传入单个CSS类名,你传入的mat-select-arrow-wrapper.ng-tns-c73-7是多类组合的CSS选择器语法,用错定位方法本身就会导致找不到元素 - 错误2:类名中的
ng-tns-c73-7是Angular框架动态生成的随机后缀类名,页面每次加载、版本更新后后缀都会变化,用这个做定位条件本身就不稳定
针对需要手动点击窗口才能操作的问题,按以下方案调整即可解决:
- 操作页面前先强制激活当前窗口的焦点,避免Selenium操作焦点未绑定到新打开的浏览器窗口
- 替换硬等待为显性等待,搭配稳定的CSS选择器定位元素,不要使用动态生成的随机类名
- 如果元素不在初始视口内,点击前先滚动到元素位置,避免元素不可交互的问题
修正后可运行代码示例
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from webdriver_manager.chrome import ChromeDriverManager url = "https://www.pamyra.de/" driver = webdriver.Chrome(ChromeDriverManager().install()) driver.get(url) # 强制激活当前窗口焦点,解决需要手动点击窗口的问题 driver.switch_to.window(driver.current_window_handle) wait = WebDriverWait(driver, 10) # 用稳定的CSS选择器定位,可根据页面实际结构调整规则,避免使用动态ng-tns类 # 示例规则为定位第三个选择框的箭头元素,可根据实际页面替换 target_select = wait.until(EC.element_to_be_clickable( (By.CSS_SELECTOR, ".mat-select-container:nth-of-type(3) .mat-select-arrow-wrapper") )) # 滚动到元素位置保证可见 driver.execute_script("arguments[0].scrollIntoView();", target_select) target_select.click()
如果点击仍无响应,可替换原生点击为JS点击,规避元素被遮挡等交互限制:
driver.execute_script("arguments[0].click();", target_select)
内容的提问来源于stack exchange,提问作者Julio Reckin
相关产品推荐
相关产品推荐

