У меня проблема с настройкой предпочтительного (принятого языка) в 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

Я использую это в своем 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
Вы сможете решить свою проблему, добавив экспериментальный вариант:
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
согласно документации есть метод add_preference, можете ли вы попробовать options .add_preference('intl.accept_languages', 'de')
Я нашел решение, которое мне подходит. Как и во многих случаях проблема была перед экраном и просто не работает достаточно точно ;-)
Вместо использования
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' } }
# ...
В предыдущем примере выдается предупреждение об устаревании:
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' }
)
},
)
Привет, Крис, большое спасибо за быстрый ответ. Это может быть общий подход. К сожалению, в моей конкретной ситуации я не могу использовать Capybara и должен придерживаться простого Selenium WebDriver + драйвера Chrome. Krid