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
相关产品推荐
相关产品推荐

