【问题标题】:Selenium Webdriver - set preferred browser language DESelenium Webdriver - 设置首选浏览器语言 DE
【发布时间】:2019-02-05 12:06:35
【问题描述】:

我在使用 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

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

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

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

而不是 add_argument 但它不会改变任何行为。

有没有人知道如何强制由 Ruby 中的 Selenium Webdriver 控制的无头 Chrome 以定义的语言请求页面内容,或者 - 不是最佳的,但作为一种解决方法可能会有所帮助 - 停止转发?

非常感谢任何帮助

最好的

孩子

【问题讨论】:

    标签: ruby selenium selenium-webdriver webdriver


    【解决方案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
    

    【讨论】:

    • 您好克里斯,非常感谢您的快速回复。这可能是一种通用方法。不幸的是,在我的具体情况下,我不能使用 Capybara,必须坚持使用普通的 Selenium WebDriver + Chrome 驱动程序。克里德
    【解决方案2】:

    您应该能够通过添加一个实验选项来解决您的问题:

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

    我确信它适用于 Python,但我没有尝试过 Ruby:这种方法是正确的,但不确定实现。
    您可以在this repository 中找到在 Python 代码中处理您的问题的代码,以及在 this Q&A 如何在 Ruby 中实现实验选项

    【讨论】:

    • 您好 Gsk,也感谢您的回答。不幸的是,我找不到有效的 Ruby 表达式。尝试了提议的论点的不同组合,但没有改变行为。例如options.add_preference('intl.accept_languages','de')。网络不提供除此之外的任何内容。要么没有办法告诉带有 Selenium Webdriver 的 Chrome 使用除 EN 之外的另一种语言,要么它被很好地隐藏了。克里德
    • 根据文档有一个方法add_preference你能试试options .add_preference('intl.accept_languages', 'de')
    【解决方案3】:

    我找到了适合我的解决方案。在许多情况下,问题出在屏幕前,而且工作不够精确;-)

    而不是使用

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

    你必须使用

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

    当我使用 IETF 语言标签时,我最初发布的代码按预期工作。

    【讨论】:

      【解决方案4】:

      对我有用:

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

      【讨论】:

        【解决方案5】:

        options 散列中的 prefs 散列对我有用。它位于driven_by :selenium 行的末尾。

        (在test/application_syste_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 is deprecated. Use Selenium::WebDriver::Chrome::Options#add_preference instead.

        IMO,下面的解决方案更丑陋,但我发布它是为了当它完全被弃用并且原来的停止工作时。

        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' }
              )
            },
          )
        
        

        【讨论】: