Как захватить заголовки в python selenium-webdriver

Я пытаюсь захватить заголовки в selenium webdriver. Что-то похожее на следующее:

>>> import requests
>>> res=requests.get('http://google.com')
>>> print res.headers

Мне нужно использовать webdriver Chrome, потому что он поддерживает flash и некоторые другие вещи, которые мне нужны для проверки веб-страницы. Вот что я до сих пор в Селене:

from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://login.comcast.net/login?r=comcast.net&s=oauth&continue=https%3A%2F%2Flogin.comcast.net%2Foauth%2Fauthorize%3Fclient_id%3Dxtv-account-selector%26redirect_uri%3Dhttps%3A%2F%2Fxtv-pil.xfinity.com%2Fxtv-authn%2Fxfinity-cb%26response_type%3Dcode%26scope%3Dopenid%2520https%3A%2F%2Flogin.comcast.net%2Fapi%2Flogin%26state%3Dhttps%3A%2F%2Ftv.xfinity.com%2Fpartner-success.html%26prompt%3Dlogin%26response%3D1&reqId=18737431-624b-44cb-adf0-2a85d91bd662&forceAuthn=1&client_id=xtv-account-selector')
driver.find_element_by_css_selector('#user').send_keys('[email protected]')
driver.find_element_by_css_selector('#passwd').send_keys('XXY')
driver.find_element_by_css_selector('#passwd').submit()
print driver.headers ### How to do this?

Я видел некоторые другие ответы, которые рекомендуют запускать весь сервер селена для получения этой информации (https://github.com/derekargueta/selenium-profiler). Как мне получить его с помощью чего-то похожего на выше с помощью Webdriver?

Ответ 1

К сожалению, вы не можете получить эту информацию от веб-сервера Selenium, и вы не сможете в любое время в ближайшем будущем. Выдержка из очень продолжительный разговор по этому вопросу:

Эта функция не будет выполняться.

Суть основной причины состоит в том, что из того, что я собираю из обсуждения, что веб-сервер предназначен для "управления браузером" и расширения API за пределами этой основной цели, по мнению разработчиков, приведет к тому, что общее качество и надежность API.

Один потенциальный обходной путь, который я видел в ряде мест, в том числе связанный выше, заключается в использовании BrowserMob Proxy, который может использоваться для захвата содержимого HTTP, а может использоваться с селеном - хотя связанный пример не использует API Selenium Python. Кажется, что существует оболочка Python для прокси-сервера BrowserMob, но я не могу ручаться за ее эффективность, так как я никогда не использовал ее.

Ответ 2

Вы можете попробовать Mobilenium, пакет Python (все еще в разработке), который связывает BrowserMob Proxy и Selenium.

Пример использования:

>>> from mobilenium import mobidriver
>>>
>>> browsermob_path = 'path/to/browsermob-proxy'
>>> mob = mobidriver.Firefox(browsermob_binary=browsermob_path)
>>> mob.get('http://python-requests.org')
301
>>> mob.response['redirectURL']
'http://docs.python-requests.org'
>>> mob.headers['Content-Type']
'application/json; charset=utf8'
>>> mob.title
'Requests: HTTP for Humans \u2014 Requests 2.13.0 documentation'
>>> mob.find_elements_by_tag_name('strong')[1].text
'Behold, the power of Requests'

Ответ 3

Вы можете получить заголовок через журнал (источник из ответ Mma)

from selenium import webdriver
import json
driver = webdriver.PhantomJS(executable_path=r"your_path")
har = json.loads(driver.get_log('har')[0]['message']) # get the log
print('headers: ', har['log']['entries'][0]['request']['headers'])

Ответ 4

Теперь, я полагаю, это очень легко. https://pypi.org/project/selenium-wire/ это расширение селена. используйте from seleniumwire import webdriver и действуйте как обычно.

Ответ 5

Вы имеете в виду данные HTTP-заголовка, верно? На самом деле это не масштаб Selenium: Selenium автоматизирует браузеры. Это так! Итак, если вы не можете сделать это с помощью своего браузера (и я не знаю ни о каком другом), Selenium - неправильный инструмент для использования. Однако, если вы можете сделать это с помощью JavaScript, вы можете использовать driver.execute_script(script, *args), как описано здесь.