You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Selenium Python切换新标签页时WebDriverWait报columnNumber错误求助

问题:Selenium切换新标签页后使用WebDriverWait报错"missing or invalid columnNumber"

原代码(运行正常):

self.driver.execute_script("window.open(arguments[0])", self.listing_url)
self.driver.switch_to.window(self.driver.window_handles[1])
time.sleep(10)

替换time.sleep为WebDriverWait后的代码(报错):

self.driver.execute_script("window.open(arguments[0])", self.listing_url)
self.driver.switch_to.window(self.driver.window_handles[1])
WebDriverWait(self.driver, 20).until(EC.presence_of_element_located((By.XPATH, '//div[@class="honbun"]')))

错误日志:

Traceback (most recent call last):
  File "D:\tender_scraper\engine\Spider.py", line 308, in parse_index_page
    index_handle = self.load_listing_page(listing, i, index_listing)
  File "D:\tender_scraper\spiders\gunmapref_listing_spider.py", line 298, in load_listing_page
    WebDriverWait(self.driver, 20).until(EC.presence_of_element_located((By.XPATH, '//div[@class="honbun"]')))
  File "D:\scraper\lib\site-packages\selenium\webdriver\support\wait.py", line 78, in until
    value = method(self._driver)
  File "D:\scraper\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 64, in _predicate
    return driver.find_element(*locator)
  File "D:\scraper\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 1251, in find_element
    return self.execute(Command.FIND_ELEMENT, {
  File "D:\scraper\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 430, in execute
    self.error_handler.check_response(response)
  File "D:\scraper\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 247, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: unknown error: missing or invalid columnNumber
  (Session info: headless chrome=104.0.5112.48)

问题原因

这个错误本质是新标签页未完成初始化就执行元素定位操作导致的ChromeDriver与浏览器通信异常。即便切换了window handle,新标签页的DOM环境可能还没完全加载完成,直接调用WebDriverWait会触发浏览器端的渲染/JS执行异常,无头模式下这类问题更易出现。

解决方案

步骤1:等待新的window handle出现

在切换标签页前,先等待浏览器创建新的窗口句柄,避免直接取索引[1]时新标签页还未生成。

步骤2:切换后等待页面就绪

切换到新标签页后,先等待页面的document.readyState变为complete,确保页面基础环境加载完成,再执行元素定位等待。

修改后的完整代码

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait

# 打开新标签页
self.driver.execute_script("window.open(arguments[0])", self.listing_url)

# 等待新的window handle出现
WebDriverWait(self.driver, 20).until(lambda d: len(d.window_handles) > 1)

# 切换到新标签页(用[-1]取最新打开的标签页,比固定[1]更可靠)
new_window_handle = self.driver.window_handles[-1]
self.driver.switch_to.window(new_window_handle)

# 等待页面document就绪
WebDriverWait(self.driver, 20).until(
    lambda d: d.execute_script('return document.readyState') == 'complete'
)

# 再等待目标元素出现
WebDriverWait(self.driver, 20).until(EC.presence_of_element_located((By.XPATH, '//div[@class="honbun"]')))

可选优化(针对无头模式)

如果是无头模式运行,添加以下ChromeOptions参数,提升稳定性:

options = webdriver.ChromeOptions()
options.add_argument("--headless=new")  # Chrome 109+推荐的无头模式,更接近正常浏览器
options.add_argument("--disable-gpu")
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")

内容的提问来源于stack exchange,提问作者Frank_JDE

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 00:43:26