Selenium(Python)打开新标签页后无法关闭、停留在原页问题求助
Selenium 新标签页无法关闭问题修复方案
你的判断完全正确:Selenium 默认不会自动切换窗口上下文,所有操作默认都作用在触发新标签页的原始页面上,你发送的关闭快捷键并没有作用到新打开的标签页,因此无法生效。
核心修复逻辑
- 提前保存原始页面的窗口句柄,方便关闭新标签后切回原页面继续执行后续操作
- 新标签页打开后,获取当前所有窗口的句柄列表,切换到最新打开的标签页(一般是列表最后一个元素)
- 关闭当前激活的标签页,推荐直接使用
driver.close()方法,比发送系统快捷键兼容性更高,不需要区分 Mac/Windows 系统的按键差异 - 操作完成后切回原始页面的窗口句柄
调整后的代码示例
你只需要修改循环内打开新标签后的逻辑即可,参考代码如下:
# 建议在最外层循环外提前保存原始页面句柄 original_window = driver.current_window_handle for x in range(2000): time.sleep(1.5) for x in range(3): company_elem = driver.find_element_by_xpath('//*[@id="company_ratings"]/div[' + element_num[0] + ']' + '/div[1]/a') element_num.pop(0) '''Scrolls to element''' desired_y = (company_elem.size['height'] / 2) + company_elem.location['y'] current_y = (driver.execute_script('return window.innerHeight') / 2) + driver.execute_script('return window.pageYOffset') scroll_y_by = desired_y - current_y driver.execute_script("window.scrollBy(0, arguments[0]);", scroll_y_by) '''_''' time.sleep(0.5) company_elem.send_keys(Keys.COMMAND + Keys.SHIFT + Keys.RETURN) time.sleep(2) # 新增切换窗口逻辑 all_windows = driver.window_handles # 切换到新打开的标签页 driver.switch_to.window(all_windows[-1]) # 关闭当前标签页 driver.close() # 切回原始页面 driver.switch_to.window(original_window) time.sleep(1) button_next_pg = driver.find_element_by_xpath('//*[@id="victor-pagination"]/a[' + next_page[0] + ']') next_page.pop(0) desired_y = (button_next_pg.size['height'] / 2) + button_next_pg.location['y'] current_y = (driver.execute_script('return window.innerHeight') / 2) + driver.execute_script('return window.pageYOffset') scroll_y_by = desired_y - current_y driver.execute_script("window.scrollBy(0, arguments[0]);", scroll_y_by) time.sleep(1) button_next_pg.click()
优化建议
可以用Selenium的显式等待替代固定的time.sleep,避免网络波动、页面加载慢导致的逻辑异常,示例如下:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 打开新标签前记录当前窗口数量 window_count = len(driver.window_handles) company_elem.send_keys(Keys.COMMAND + Keys.SHIFT + Keys.RETURN) # 最多等待10秒,直到新窗口打开 WebDriverWait(driver, 10).until(EC.number_of_windows_to_be(window_count + 1)) # 再执行切换逻辑 all_windows = driver.window_handles driver.switch_to.window(all_windows[-1])
内容的提问来源于stack exchange,提问作者Markas Povilaika
相关产品推荐
相关产品推荐

