Selenium谷歌账号登录自动化测试遇空白白屏问题求助
这种情况我做自动化测试时也碰到过,十有八九是谷歌的反自动化检测机制在搞事情——毕竟谷歌对非人类行为的识别越来越严格了。结合你提到的「2个月前正常、手动登录无异常」的情况,给你几个实用的排查和解决方向:
1. 启用无痕模式或复用真实用户会话
默认的Selenium浏览器会话是完全干净的,没有任何浏览历史、缓存或已登录状态,谷歌很容易把它判定为自动化程序。你可以试试两种方案:
方案1:启动无痕模式
给Chrome添加--incognito参数,模拟用户的无痕浏览场景:from selenium import webdriver from selenium.webdriver.chrome.options import Options chrome_options = Options() chrome_options.add_argument("--incognito") driver = webdriver.Chrome(options=chrome_options)方案2:复用日常登录的用户数据
如果你的本地Chrome已经登录过目标谷歌账号,可以直接调用这个用户的数据目录,相当于复用手动登录的会话,能绕过大部分检测。注意替换成你自己的用户数据路径:chrome_options.add_argument(r"--user-data-dir=C:\Users\YourUsername\AppData\Local\Google\Chrome\User Data") chrome_options.add_argument("--profile-directory=Default")⚠️ 注意:使用这个方案时,必须确保本地Chrome浏览器没有在运行,否则会报错。
2. 添加反检测参数,伪装成真实浏览器
谷歌会通过浏览器的一些特征判断是否为自动化程序,比如navigator.webdriver标记、自动化扩展等。你可以添加以下参数来去除这些特征:
chrome_options.add_argument("--disable-blink-features=AutomationControlled") chrome_options.add_argument("--start-maximized") # 模拟最大化窗口 chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"]) chrome_options.add_experimental_option('useAutomationExtension', False)
另外,还可以通过Chrome DevTools命令去掉navigator.webdriver的标识:
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", { "source": """ Object.defineProperty(navigator, 'webdriver', { get: () => undefined }) """ })
3. 模拟人类操作速度,避免过快触发检测
自动化操作的速度远快于人类,这也是谷歌检测的关键点之一。不要直接用send_keys一次性输入完整的邮箱或密码,拆分输入并添加随机间隔:
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time import random # 输入邮箱(逐字符输入,间隔0.1-0.3秒) email_input = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "identifierId"))) email = "your-google-email@gmail.com" for char in email: email_input.send_keys(char) time.sleep(random.uniform(0.1, 0.3)) # 点击下一步后等待1-2秒,再操作密码框 WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "identifierNext"))).click() time.sleep(random.uniform(1, 2)) # 密码输入同理 password_input = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.NAME, "Passwd"))) password = "your-password" for char in password: password_input.send_keys(char) time.sleep(random.uniform(0.1, 0.3)) WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "passwordNext"))).click()
4. 排查是否触发二次验证
虽然你手动登录没问题,但自动化登录时谷歌可能会触发隐性的二次验证(比如验证码、设备验证),导致页面空白。你可以检查是否有被拦截的弹窗,或者切换回原窗口查看是否有验证提示。不过这个可能性相对较低,可以作为最后排查项。
如果上面的方法都不行,还可以试试undetected-chromedriver这个第三方库——它专门针对谷歌的反自动化机制做了优化,用法和原生Selenium几乎一致,能绕过大部分检测。
内容的提问来源于stack exchange,提问作者Rafał Witulski

