
Selenium 进阶多窗口切换 JS执行 Select下拉框一、多标签/多窗口切换原理打开新标签页后driver 默认停留在原始窗口不会自动切换必须手动切换句柄window_handles获取所有窗口句柄返回列表current_window_handle当前所在窗口句柄核心语法# 获取全部窗口句柄all_handlesweb_driver.window_handles# 切换到最后打开的新窗口web_driver.switch_to.window(all_handles[-1])# 切回第一个原始窗口web_driver.switch_to.window(all_handles[0])完整示例fromseleniumimportwebdriverfromselenium.webdriver.edge.serviceimportServicefromselenium.webdriver.common.byimportByfromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.supportimportexpected_conditionsasEC web_driverwebdriver.Edge(serviceService(rD:\Software\edgedriver_win64\msedgedriver.exe))waitWebDriverWait(web_driver,10)web_driver.get(https://www.baidu.com)# 在百度点击打开新页面的链接linkwait.until(EC.element_to_be_clickable((By.LINK_TEXT,新闻)))link.click()# 切换到新窗口all_handleweb_driver.window_handles web_driver.switch_to.window(all_handle[-1])print(新页面标题,web_driver.title)# 切回首页# web_driver.switch_to.window(all_handle[0])web_driver.quit()⚠️ 坑点击产生新窗口后需要短暂等待新窗口句柄生成配合显式等待判断句柄数量变化二、执行 JS 脚本高频实用很多场景 selenium API 做不到页面滚动、移除元素遮挡、修改元素属性、点击被遮挡元素# 执行js模板web_driver.execute_script(js代码)# 如果需要传元素给js后面传参数在js里用 arguments[0]web_driver.execute_script(arguments[0].click();,elem)常用JS模板# 1. 滚动到元素可见web_driver.execute_script(arguments[0].scrollIntoView(true);,elem)# 2. 滚动到页面底部web_driver.execute_script(window.scrollTo(0,document.body.scrollHeight))# 3. 移除元素遮挡删除遮挡弹窗web_driver.execute_script(arguments[0].remove(),mask_elem)# 4. 修改输入框value值绕过前端readonly只读限制web_driver.execute_script(arguments[0].value测试文本,input_elem)三、Select 下拉选择框标准下拉标签select⚠️ 仅适用于原生selectoption/option/select如果是div模拟的自定义下拉框不能用Select类要用鼠标悬浮点击导入fromselenium.webdriver.support.uiimportSelect三种选择方式# 1. 先定位select元素select_elemwait.until(EC.visibility_of_element_located((By.ID,city)))# 实例Select对象selectSelect(select_elem)select.select_by_index(1)# 根据下标从0开始select.select_by_value(sh)# 根据option value属性select.select_by_visible_text(上海)# 根据页面展示文本最常用# 获取所有选项option_listselect.options# 取消选中多选下拉框select.deselect_all() 课堂练习需求打开百度点击【图片】会新开标签切换到新打开的图片标签页使用JS滚动页面到底部截图保存页面关闭浏览器