Selenium Webdriver - 设置首选浏览器语言为德语

3
我在使用Selenium Webdriver和Ruby时,遇到了一个问题,无法在无头Chrome中设置首选语言(接受的语言)。我使用以下WebDriver设置:
Selenium::WebDriver::Chrome.driver_path = @config[<path to the Chrome Driver>]

options = Selenium::WebDriver::Chrome::Options.new
options.add_argument('--headless')
options.add_argument('--disable-translate')
options.add_argument("--lang=de")

驱动程序随后被初始化为:
@selenium_driver = Selenium::WebDriver.for :chrome, options: options

一切运作正常,但在某些页面上,Chrome返回英文内容,即使我导航到德语页面URL(例如page.de)。在这些情况下,Chrome驱动程序由于内部转发到page.de/en而返回英文内容。在我的查询URL中,我没有指定en路径。

我尝试使用Webdriver首选项来设置语言:

options.add_preference('accept_languages', 'de')

不是使用add_argument,但它并没有改变任何行为。

有人知道如何强制在Ruby中使用Selenium Webdriver控制无头Chrome请求以指定的语言获取页面内容吗?或者 - 虽然不是最佳解决方案,但可能作为一种变通方法 - 如何停止页面的转发?

6个回答

4
我是一名有用的助手,可以为您翻译文本。
我找到了一个适合我的解决方案。就像许多情况一样,问题出在屏幕前,它并不够精确,;-)
与其使用
options.add_argument("--lang=de")

你需要使用

options.add_argument("--lang=de-DE")

当我使用IETF语言标签时,我最初发布的代码可以正常工作。

1

我在test_helper.rb中使用这个,对我来说很好用。

Capybara.register_driver :selenium do |app|
  Chromedriver.set_version "2.36"

  desired_capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(
    'chromeOptions' => {
      'prefs' => {
        'intl.accept_languages' => 'en-US'
     },
     args: ['disable-gpu', 'headless']
   }
  )

  Capybara::Selenium::Driver.new(app, { browser: :chrome, desired_capabilities: desired_capabilities })
end

Capybara.javascript_driver = :chrome
Capybara.default_driver = :selenium

你好Chris,非常感谢您的快速回复。那可能是一种通用方法。不幸的是,在我的具体情况下,我不能使用Capybara,只能坚持使用纯Selenium WebDriver + Chrome驱动程序。Krid - Krid

1
这个options哈希中的prefs哈希对我很有用。它在driven_by :selenium行的末尾。

(位于test/application_system_test_case.rb内部)

# frozen_string_literal: true

require 'test_helper'
require 'capybara/rails'

class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
  driven_by :selenium, using: :chrome, screen_size: [1400, 1400], options: { prefs: { 'intl.accept_languages' => 'de,de-DE;q=0.9,en;q=0.1' } }

# ...

2021-06-14 更新:

之前的示例会产生以下弃用警告:

WARN Selenium [DEPRECATION] :prefs 已弃用。请使用 Selenium::WebDriver::Chrome::Options#add_preference。

个人认为下面的解决方案更丑陋,但我会将其发布出来,以备原始方法停止工作时使用。

class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
  driven_by(:selenium,
    using: :chrome,
    screen_size: [1400, 1400],
    options: {
      options: Selenium::WebDriver::Chrome::Options.new(
        prefs: { 'intl.accept_languages' => 'de,de-DE;q=0.9,en;q=0.1' }
      )
    },
  )


0

你应该可以通过添加一个实验选项来解决你的问题:

options.add_option('prefs', {'intl.accept_languages': 'en,en_US'})

我确定它可以在Python中工作,但我没有尝试过Ruby:这种方法是正确的,但实现不确定。
您可以在此存储库中找到处理Python代码中您的问题的代码,在此问答中找到如何在Ruby中实现experimental_options。


你好Gsk,也谢谢你的回答。不幸的是,我无法找到可行的Ruby表达式。已尝试不同的参数组合,但没有改变行为。例如 options.add_preference('intl.accept_languages','de')。网络上也没有提供更多信息。要么就是没有办法告诉Selenium Webdriver让Chrome使用英语以外的其他语言,要么这个方法被隐藏的很好。Krid - Krid
根据文档,有一个名为 add_preference 的方法,你可以尝试使用 options .add_preference('intl.accept_languages', 'de') - Chris

0
chrome_options.add_argument("--lang=en")
 
chrome_options.add_argument("--enable-experimental-accessibility-language-detection-dynamic")

chrome_options.add_argument("--enable-experimental-accessibility-language-detection")

这应该有助于在 Chrome 无头模式下设置语言为英文


您的回答可以通过提供更多的支持信息来改进。请编辑以添加进一步的细节,例如引用或文件,以便其他人可以确认您的答案是否正确。您可以在帮助中心找到有关如何撰写好答案的更多信息。 - LinFelix

0

对我来说可以工作:

options = Selenium::WebDriver::Firefox::Options.new
options.add_preference("intl.accept_languages", 'de-DE')
Capybara::Selenium::Driver.new(app, browser: :firefox, options: options)

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