WebDriver: 如何为Chrome指定首选语言

8

我正在尝试让我的远程Chrome驱动程序请求德语页面而不是英语页面。根据chromedriver文档chrome偏好设置列表,我尝试这样设置:

    capabilities.setCapability(ChromeOptions.CAPABILITY, getChromeOptions());
    Map<String, String> chromePrefs = new HashMap<String,String>();
    chromePrefs.put("settings.language.preferred_languages", "de-DE,de");
    capabilities.setCapability("chrome.prefs", chromePrefs);

我可以从日志文件中看到它已经连接到了chromedriver:

[0.453][FINE]:      Initializing session with capabilities {
   "browserName": "chrome",
   "chrome.prefs": {
      "settings.language.preferred_languages": "de-DE,de"
   },
   "chromeOptions": {
      "args": [ "--ignore-certificate-errors" ],
      "extensions": [  ]
   },
   "platform": "ANY",
   "version": null
}

但它仍然请求英文页面,这也可以通过在首选项中打开内容设置来查看。我做错了什么?

2个回答

7

(编辑) 简而言之:

  1. intl.accept_languages 是用于控制页面请求的语言偏好设置。
  2. 使用(更新且首选)ChromeOptions 机制来设置偏好设置的能力(否则,如果您或您的语言绑定设置了任何ChromeOptions,则不起作用,请参见问题10495)。

    ChromeOptions支持设置偏好设置,但尚未完全实现。因此,不幸的是,您必须使用我在问题95的第6条评论中提到的“肮脏的解决方法”

    另一种替代方法可能是创建具有所需语言设置的用户配置文件,并使用ChromeOption设置(命令行)选项以使用此配置文件,如chromedriver功能 wiki页面所述。


这非常有道理,特别是因为这是Firefox使用的相同密钥。但它也不起作用:/ - c089
是的,现在我也可以确认Python调用方面的问题。我添加了一些关于我认为出了什么问题(包括一个错误报告)以及可能的替代解决方案/解决方法,直到它得到修复的文本。这可能不是你所希望的答案,但我仍然希望它能在某种程度上有所帮助。 - zpea
感谢您的努力和提交错误报告 :) - c089
在我的新的简短回答中,还有一个Java示例链接,用于解决ChromeOptions与“经典”Capabilities问题以及ChromeOptions缺乏偏好设置支持的问题。如果它能解决你的问题,请告诉我! :) - zpea
反射hack不再必要,因为experimentalOptions现在是公开的:https://gist.github.com/c089/a5cbb834f9b54004de9b - c089
1
请注意,此偏好设置在无头模式下将被忽略!请参见https://bugs.chromium.org/p/chromedriver/issues/detail?id=3992。 - Sephiroth

0

Python示例

注意:我使用“en,en_US”接受的语言进行测试,但只要系统上有区域设置可用,我不认为它不能与de_DE一起使用。

这适用于Selenium。

from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
from splinter.driver.webdriver import BaseWebDriver, WebDriverElement

options = Options()
options.add_experimental_option('prefs', {'intl.accept_languages': 'de_DE'})

browser = BaseWebDriver()
browser.driver = Chrome(chrome_options=options)

browser.visit('http://example.com')

使用Splinter有两个选项:

仅使用Splinter API

from splinter import Browser
from splinter.driver.webdriver.chrome import Options

options = Options()
options.add_experimental_option('prefs', {'intl.accept_languages': 'de_DE'})

browser = Browser('chrome', options=options)

browser.visit('http://example.com')

Splinter 和 Selenium API

from splinter import Browser
from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_experimental_option('prefs', {'intl.accept_languages': 'de_DE'})

browser = Browser('chrome', options=options)

browser.visit('http://example.com')

2
这是一个旧答案,但在我的情况下(2022年),我不得不使用de-DE而不是de_DE。在http://www.reliply.org/tools/requestheaders.php上,我可以看到`de-DE`也被扩展为`de-DE,de;q=0.9`,而`de_DE`只导致`de_DE`。 - Kelvin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接