Настройка пользовательского агента пользователя в Selenium Webdriver для PhantomJS с Ruby

Сегодня вечером я рыскал по сети, часа 3-4. Я пробовал каждое предложение, с которым сталкивался. Я даже проверил объект «возможности» в моем объекте драйвера Selenium, чтобы убедиться, что он действительно установлен там, и это действительно так:

#<Selenium::WebDriver::Remote::Capabilities:0x00000007475cf0
 @capabilities=
  {:browser_name=>"phantomjs",
   :version=>"1.9.7",
   :platform=>:"linux-unknown-64bit",
   :javascript_enabled=>true,
   :css_selectors_enabled=>true,
   :takes_screenshot=>true,
   :native_events=>true,
   :rotatable=>false,
   :firefox_profile=>nil,
   :proxy=>#<Selenium::WebDriver::Proxy:0x00000007475908 @type=:direct>,
   "driverName"=>"ghostdriver",
   "driverVersion"=>"1.1.0",
   "handlesAlerts"=>false,
   "databaseEnabled"=>false,
   "locationContextEnabled"=>false,
   "applicationCacheEnabled"=>false,
   "browserConnectionEnabled"=>false,
   "webStorageEnabled"=>false,
   "acceptSslCerts"=>false,
   "proxy"=>{"proxyType"=>"direct"},
   "phantomjs.page.settings.userAgent"=>
    "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:27.0) Gecko/20100101 Firefox/27.0"}>

Помимо «phantomjs.page.settings.userAgent», я пробовал «userAgent» и т. д. Все, что я мог найти в Интернете за последние 3-4 часа, я пробовал. Видимо, ближе к началу 2013 года это был довольно распространенный вопрос, и решения, о которых я говорю, были, по-видимому, распространенными решениями. Ни один из них не работает, и на самом деле я точно знаю это из этой части информации (обратите внимание, что User-Agent — это «Ruby»):

UNCAUGHT EXCEPTION: {"errorMessage"=>"Element is not currently visible and may not be manipulated",
 "request"=>
  {"headers"=>
    {"Accept"=>"application/json",
     "Accept-Encoding"=>"gzip;q=1.0,deflate;q=0.6,identity;q=0.3",
     "Connection"=>"close",
     "Content-Length"=>"2",
     "Content-Type"=>"application/x-www-form-urlencoded",
     "Host"=>"localhost:9876",
     "User-Agent"=>"Ruby"},
   "httpVersion"=>"1.1",
   "method"=>"POST",
   "post"=>"{}",
   "postRaw"=>"{}",
   "url"=>"/click",
   "urlParsed"=>
    {"anchor"=>"",
     "query"=>"",
     "file"=>"click",
     "directory"=>"/",
     "path"=>"/click",
     "relative"=>"/click",
     "port"=>"",
     "host"=>"",
     "password"=>"",
     "user"=>"",
     "userInfo"=>"",
     "authority"=>"",
     "protocol"=>"",
     "source"=>"/click",
     "queryKey"=>{},
     "chunks"=>["click"]},
   "urlOriginal"=>
    "/session/a03cc440-4f5c-11e4-8854-ed9c22bf60af/element/%3Awdc%3A1412822036214/click"}}

К сожалению, есть гораздо больше информации и обсуждений по этим проблемам Selenium и многим другим, если вы используете Java. На данный момент я бы хотел во всех отношениях использовать Java для этого проекта, но теперь у меня есть 30 000 строк кода, которые я полностью написал сам за последние 2 месяца. Потеря этой работы, по крайней мере сейчас, была бы разрушительной не только для меня лично, но и для моей работы.

Что дает? Мне действительно придется копаться и настраивать исходный код, чтобы получить то, что я хочу, или эта функция действительно уже реализована? Опять же, я видел все ответы с начала 2013 года, но они у меня не работают, и я понятия не имею, почему и как это легко исправить. У меня крайний срок, так что это начинает быть очень напряженным.

У кого-нибудь есть идеи для меня? Имейте в виду, что я использую Ruby, а не Java.

Селен-вебдрайвер 2.43. PhantomJS 1.9.7. GhostDriver 1.1.0.

Мне кажется невероятным, что нет возможности изменить ваш User-Agent.

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

Я заранее признателен, если вы будете так любезны поделиться несколькими идеями или некоторой информацией, чтобы указать мне правильное направление.


person Ethan Barron    schedule 09.10.2014    source источник
comment
Никогда не пробовал сам, но проверьте это: github.com/mururu/capybara-user_agent. В основном он делает Capybara.current_session.driver.add_headers('User-Agent' => user_agent) или Capybara.current_session.driver.header('User-Agent', user_agent) под капотом, в зависимости от того, что определено.   -  person moonfly    schedule 09.10.2014
comment
Эх, похоже, это не сработает из-за stackoverflow.com/a/15647143/2117020. Итак, я думаю, лучший подход — переключиться с Selenium на Poltergeist (github.com/teampoltergeist/poltergeist). Кажется, поддерживает add_headers.   -  person moonfly    schedule 09.10.2014
comment
Ну это отстой! Я думаю, что вам нужно использовать Capybara, чтобы использовать Полтергейст, но я посмотрю код там больше и посмотрю, что я мог бы сделать на скорую руку. Спасибо. Дайте мне знать, если у вас есть еще идеи.   -  person Ethan Barron    schedule 09.10.2014


Ответы (2)


В Java я сделал следующее: (PhantomJS 1.9.8, Selenium 2.39)

String userAgent = "Mozilla/5.0 (Linux; U; Android 2.3.3; en-us; LG-LU3000 Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1";
DesiredCapabilities caps = new DesiredCapabilities();
caps.setCapability(PhantomJSDriverService.PHANTOMJS_PAGE_SETTINGS_PREFIX + "userAgent", userAgent);
PhantomJSDriver driver = new PhantomJSDriver(caps);

Возможно, есть аналогичные параметры настройки для Ruby. Взгляните на "page.settings.userAgent"

person AnDus    schedule 30.03.2015

Это оказалось не «возможным» из коробки, как упомянул Moonfly в своих комментариях к моему вопросу. Однако это оказывается относительно легко сделать. Я должен отметить, что это не решило мою конкретную проблему. Я предположил, возможно, наивно, что получаю странные результаты из-за User-Agent 'Ruby'. Оказывается, я потратил часы на то, чтобы понять это зря; Я все еще получаю тот же результат.

Но для тех из вас, кому это поможет, вам нужно будет сделать быстрый обезьяний патч для Selenium. Грязный, грубый, уродливый, хакерский, я знаю. Но это помогло.

Обратите внимание, что это обезьяний патч для selenium-webdriver Ruby версии 2.43.0 — если у вас есть другая версия, нет гарантии, что она будет работать.

module Selenium
    module WebDriver
        module Remote
            module Http

                class Default < Common
                    private

                    def request(verb, url, headers, payload, redirects = 0)
            # THIS IS WHERE OUR CUSTOM CHANGE BEGINS
            headers.merge!('User-Agent' => 'Whatever User Agent You May Want')
            # THIS IS WHERE OUR CUSTOM CHANGE ENDS

            request = new_request_for(verb, url, headers, payload)

            retries = 0
            begin
              response = response_for(request)
            rescue Errno::ECONNABORTED, Errno::ECONNRESET, Errno::EADDRINUSE
              # a retry is sometimes needed on Windows XP where we may quickly
              # run out of ephemeral ports
              #
              # A more robust solution is bumping the MaxUserPort setting
              # as described here:
              #
              # http://msdn.microsoft.com/en-us/library/aa560610%28v=bts.20%29.aspx
              raise if retries >= MAX_RETRIES

              request = new_request_for(verb, url, headers, payload)
              retries += 1

              retry
            rescue Errno::ECONNREFUSED => ex
              if use_proxy?
                raise ex.class, "using proxy: #{proxy.http}"
              else
                raise
              end
            end

            if response.kind_of? Net::HTTPRedirection
              raise Error::WebDriverError, "too many redirects" if redirects >= MAX_REDIRECTS
              request(:get, URI.parse(response['Location']), DEFAULT_HEADERS.dup, nil, redirects + 1)
            else
              create_response response.code, response.body, response.content_type
            end
          end

        end

      end
    end
  end
end
person Ethan Barron    schedule 10.10.2014
comment
Более приличный способ исправления Rubys Selenium Webdriver обезьяны был бы: Selenium::WebDriver::Remote::Http::Common::DEFAULT_HEADERS['User-Agent'] = 'Whatever User Agent You May Want' - person stmllr; 11.05.2016