Selenium Webdriver - установить предпочтительный язык браузера DE

У меня проблема с настройкой предпочтительного (принятого языка) в Chrome без головы с помощью Selenium Webdriver и Ruby. Я использую следующие настройки 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. Я не указываю путь en в запрашиваемом URL-адресе.

Я попытался установить язык с помощью предпочтения Webdriver:

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

вместо add_argument, но это ничего не меняет в поведении.

Кто-нибудь знает, как заставить безголовый Chrome, управляемый Selenium Webdriver в Ruby, запрашивать содержимое страницы на определенном языке или - не оптимально, но это может помочь в качестве обходного пути - остановить пересылку?

Любая помощь очень ценится

Лучший

Krid

Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
3
0
8 436
5

Ответы 5

Я использую это в своем 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. Krid

Krid 30.08.2018 16:51

Вы сможете решить свою проблему, добавив экспериментальный вариант:

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

Я уверен, что он работает с Python, но я не пробовал с Ruby: это правильный подход, не уверен в реализации. Вы можете найти в этот репозиторий код, который обрабатывает вашу проблему в коде Python, и в этот вопрос и ответ, как реализовать экспериментальные_опции в Ruby.

Привет, Гск, спасибо и за ответ. К сожалению, я не могу найти работающее выражение Ruby. Пробовали разные комбинации предложенных аргументов, но ничего не меняло в поведении. например options.add_preference ('intl.accept_languages', 'de'). Интернет также не предоставляет ничего, кроме этого. Либо нет способа указать Chrome с помощью Selenium Webdriver использовать другой язык, кроме EN, либо он очень хорошо скрыт. Krid

Krid 30.08.2018 21:09

согласно документации есть метод add_preference, можете ли вы попробовать options .add_preference('intl.accept_languages', 'de')

Chris 31.08.2018 08:03

Я нашел решение, которое мне подходит. Как и во многих случаях проблема была перед экраном и просто не работает достаточно точно ;-)

Вместо использования

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

ты должен использовать

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

Когда я использую языковой тег IETF, изначально опубликованный мной код работает должным образом.

У меня работает:

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

Этот хеш prefs внутри хеша options помог мне. Он находится в конце линии 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.

ИМО, решение ниже уродливее, но я публикую его, когда оно полностью устарело и оригинал перестает работать.

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

Другие вопросы по теме