Selenium 4 必须用 options + Service 初始化 Chrome,chrome_options 已弃用;mobileEmulation 需通过 Options.add_experimental_option 设置,deviceName 必须严格匹配 Chrome DevTools 内置列表,且需配合 UA 和 viewport 确保生效。

能直接用,但必须注意 chrome_options 已被弃用,Selenium 4 要用 options + Service 显式管理驱动,否则会报错或静默失败。
ChromeOptions 配置 mobileEmulation 必须用新写法
Selenium 4 不再接受 chrome_options 参数,传参方式变了。旧代码里写 webdriver.Chrome(chrome_options=options) 会触发 DeprecationWarning,严重时直接抛 TypeError: __init__() got an unexpected keyword argument 'chrome_options'。
- 必须改用
options(小写)作为唯一参数名 - 如果用了自定义 chromedriver 路径,得显式传
service=Service("path/to/chromedriver") -
mobileEmulation仍通过add_experimental_option设置,但设备名要严格匹配 Chrome 内置列表(比如"iPhone SE"可用,"iPhone SE 2020"就不行)
正确示例:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
<p>options = Options()
options.add_experimental_option("mobileEmulation", {"deviceName": "iPhone SE"})
service = Service("/usr/local/bin/chromedriver") # Linux/macOS 路径示例
driver = webdriver.Chrome(service=service, options=options)
driver.get("<a href="https://www.php.cn/link/0667f552d10337b4d16f6a154f399af9">https://www.php.cn/link/0667f552d10337b4d16f6a154f399af9</a>")
deviceName 列表不全,查不到就进 Chrome DevTools 看
网上流传的 deviceName 列表常缺新版机型,比如 "iPhone 15" 或 "Galaxy S24" 在旧文档里根本没提。硬写不存在的 name,Chrome 启动后不会报错,但页面仍是桌面模式——你根本察觉不到失败。
立即学习“Python免费学习笔记(深入)”;
- 最可靠方法:手动打开 Chrome → F12 → ⚙️ Settings → Devices → 点开下拉框,里面所有可选名字才是真实支持的
- 常见有效值有:
"iPhone SE"、"Pixel 5"、"Nexus 5"、"iPad Mini",但"iPhone X"在新版 Chrome 中已移除 - 如果必须用特定 UA 或分辨率,别依赖
deviceName,直接用deviceMetrics+userAgent组合
只设 mobileEmulation 不够,UA 和 viewport 要同步生效
仅靠 mobileEmulation 有时仍被网站识别为桌面端,尤其遇到反爬强的站点(如 CSDN 登录页)。原因是部分 JS 检测逻辑绕过 Chrome 的模拟层,直接读取 navigator.userAgent 或 screen.width。
- 务必确认
mobileEmulation生效后,打开页面按 F12,在 Console 里执行navigator.userAgent,输出应含"Mobile"和对应设备标识 - 若 UA 不对,说明模拟未触发,常见原因是 Chrome 版本太低(需 Chrome 90+)或选项传参位置错误
- 保险做法:额外加一条
options.add_argument(f"--user-agent={mobile_ua}"),UA 字符串从 DevTools 的 Network 标签里真实手机请求中复制
登录类操作容易因 Cookie 域名不匹配失败
用 add_cookie() 注入本地保存的 cookies 时,如果域名写成 ".csdn.net",而当前 URL 是 https://www.php.cn/link/0667f552d10337b4d16f6a154f399af9,Chrome 会拒绝加载——因为 m.csdn.net 和 csdn.net 属于不同子域,domain 字段必须精确匹配当前 host。
- 检查 cookie dict 的
domain键:登录页是m.csdn.net,就填"m.csdn.net";如果是www.csdn.net,才填"csdn.net"或".csdn.net" - 注入 cookie 后必须调用
driver.refresh(),否则 cookie 不生效——这不是可选步骤,是强制要求 - 如果页面跳转后丢失 cookie,大概率是
secure或httpOnly属性冲突,建议导出 cookie 时保留原始属性,不要手动设False
实际调试时,最常卡在 mobileEmulation 静默失效和 cookie domain 错配这两处,其他都是次要问题。


















