Подтвердить что ты не робот

Как получить код состояния с помощью selenium.py(код python)

Я пишу selenium script на python, но я думаю, что не вижу никакой информации о:

Как получить код статуса http из selenium Python code.

Или я чего-то не хватает. Если кто-нибудь нашел это, пожалуйста, не стесняйтесь публиковать сообщения.

4b9b3361

Ответ 1

Это не возможно.

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

  • Selenium - это инструмент эмуляции браузера, не обязательно инструмент для тестирования.
  • Selenium выполняет много GET и POST во время процесса рендеринга страницы, и добавление интерфейса для этого осложнит API таким образом, чтобы авторы сопротивлялись.

У нас остались хаки вроде:

  • Ищите информацию об ошибках в возвращаемом HTML.
  • Используйте другой инструмент вместо запросов (но посмотрите на недостатки этого подхода в ответе @Zeinab.

Ответ 2

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

import requests
from selenium import webdriver

driver = webdriver.get("url")
r = requests.get("url")
print r.status_code

Полное руководство по использованию запросов здесь, и вы можете установить модуль с помощью команды pip install requests.

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

Ответ 3

У меня нет большого опыта работы с python. У меня есть более подробный пример java здесь:

fooobar.com/questions/102338/...

Идея состоит в том, чтобы включить ведение журнала производительности. Это запускает "Network.enable" на хромированном краю. Затем запустите записи журнала производительности и проанализируйте их для сообщения "Network.responseReceived".

    from selenium import webdriver

    from selenium.webdriver.common.desired_capabilities import DesiredCapabilities    
    # enable browser logging
    d = DesiredCapabilities.CHROME
    d['loggingPrefs'] = { 'performance':'ALL' }

    driver = webdriver.Chrome(executable_path="c:\\windows\\chromedriver.exe", service_args=["--verbose", "--log-path=D:\\temp3\\chromedriverxx.log"], desired_capabilities=d)

    driver.get('https://api.ipify.org/?format=text')

    print(driver.title)

    print(driver.page_source)

    performance_log = driver.get_log('performance')
    print (str(performance_log).strip('[]'))

    for entry in driver.get_log('performance'):
        print (entry)

Выход будет содержать "Network.responseReceived" для вашего URL-адреса, другие запросы, выполняемые загрузкой страницы, или перенаправление URL-адресов. Все, что вам нужно сделать, это проанализировать записи журнала.

'{"message":{"method":"Network.responseReceived","params":{"frameId":"9488.1","loaderId":"9488.1","requestId":"9488.1","response":{"connectionId":14,"connectionReused":false,"encodedDataLength":-1,"fromDiskCache":false,"fromServiceWorker":false,"headers":{"Connection":"keep-alive","Content-Length":"13","Content-Type":"text/plain","Date":"Wed, 12 Oct 2016 06:15:47 GMT","Server":"Cowboy","Via":"1.1 vegur"},"headersText":"HTTP/1.1 200 OK\\r\\nServer: Cowboy\\r\\nConnection: keep-alive\\r\\nContent-Type: text/plain\\r\\nDate: Wed, 12 Oct 2016 06:15:47 GMT\\r\\nContent-Length:13\\r\\nVia:1.1vegur\\r\\n\\r\\n","mimeType":"text/plain","protocol":"http/1.1","remoteIPAddress":"54.197.246.207","remotePort":443,"requestHeaders":{"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8","Accept-Encoding":"gzip, deflate, sdch, br","Accept-Language":"en-GB,en-US;q=0.8,en;q=0.6","Connection":"keep-alive","Host":"api.ipify.org","Upgrade-Insecure-Requests":"1","User-Agent":"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36"},"requestHeadersText":"GET /?format=text HTTP/1.1\\r\\nHost: api.ipify.org\\r\\nConnection: keep-alive\\r\\nUpgrade-Insecure-Requests: 1\\r\\nUser-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36\\r\\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\\r\\nAccept-Encoding: gzip, deflate, sdch, br\\r\\nAccept-Language: en-GB,en-US;q=0.8,en;q=0.6\\r\\n\\r\\n","securityDetails":{"certificateId":1,"certificateValidationDetails":{"numInvalidScts":0,"numUnknownScts":0,"numValidScts":0},"cipher":"AES_128_GCM","keyExchange":"ECDHE_RSA","protocol":"TLS 1.2","signedCertificateTimestampList":[]},"securityState":"secure","status":200,"statusText":"OK","timing":{"connectEnd":320.508999997401,"connectStart":3.08100000256673,"dnsEnd":3.08100000256673,"dnsStart":0,"proxyEnd":-1,"proxyStart":-1,"pushEnd":0,"pushStart":0,"receiveHeadersEnd":465.725000001839,"requestTime":78246.775045,"sendEnd":320.995999994921,"sendStart":320.825999995577,"sslEnd":320.435000001453,"sslStart":141.675999999279,"workerReady":-1,"workerStart":-1},"url":"https://api.ipify.org/?format=text"},"timestamp":78247.242716,"type":"Document"}},"webview":"6e8a3b1d-e5aa-40fb-a695-280cbb0ee420"}'}, {'timestamp': 1476252948094, 'level': 'INFO', 'message': '{"message":{"method":"Network.dataReceived","params":{"dataLength":13,"encodedDataLength":171,"requestId":"9488.1","timestamp":78247.243137}},"webview":"6e8a3b1d-e5aa-40fb-a695-280cbb0ee420"}'}, {'timestamp': 1476252948094, 'level': 'INFO', 'message': '{"message":{"method":"Page.frameNavigated","params":{"frame":{"id":"9488.1","loaderId":"9488.1","mimeType":"text/plain","securityOrigin":"https://api.ipify.org","url":"https://api.ipify.org/?format=text"}}},"webview":"6e8a3b1d-e5aa-40fb-a695-280cbb0ee420"}'}, {'timestamp': 1476252948095, 'level': 'INFO', 'message': '{"message":{"method":"Network.loadingFinished","params":{"encodedDataLength":171,"requestId":"9488.1","timestamp":78247.242066}},"webview":"6e8a3b1d-e5aa-40fb-a695-280cbb0ee420"}'}, {'timestamp': 1476252948115, 'level': 'INFO', 'message': '{"message":{"method":"Page.loadEventFired","params":{"timestamp":78247.264169}},"webview":"6e8a3b1d-e5aa-40fb-a695-280cbb0ee420"}'}, {'timestamp': 1476252948115, 'level': 'INFO', 'message': '{"message":{"method":"Page.frameStoppedLoading","params":{"frameId":"9488.1"}},"webview":"6e8a3b1d-e5aa-40fb-a695-280cbb0ee420"}'}, {'timestamp': 147625298116, 'level': 'INFO', 'message': '{"message":{"method":"Page.domContentEventFired","params":{"timestamp":78247.276475}},"webview":"6e8a3b1d-e5aa-40fb-a695-280cbb0ee420"}'}, {'timestamp': 1476252948122, 'level': 'INFO', 'message': '{"message":{"method":"Network.requestWillBeSent","params":{"documentURL":"https://api.ipify.org/?format=text","frameId":"9488.1","initiator":{"type":"other"},"loaderId":"9488.1","request":{"headers":{"Referer":"https://api.ipify.org/?format=text","User-Agent":"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36"},"initialPriority":"High","method":"GET","mixedContentType":"none","url":"https://api.ipify.org/favicon.ico"},"requestId":"9488.2","timestamp":78247.280131,"type":"Other","wallTime":1476252948.11805}},"webview":"6e8a3b1d-e5aa-40fb-a695-280cbb0ee420"}'}

и получить "статус": 200 из ответа json. Вы также можете проанализировать ответные заголовки.

Ответ 4

Кажется, что можно получить код статуса ответа из журнала через API.

from selenium import webdriver
import json
browser = webdriver.PhantomJS()
browser.get('http://www.google.fr')
har = json.loads(browser.get_log('har')[0]['message'])
har['log']['entries'][0]['response']['status']
har['log']['entries'][0]['response']['statusText']

Ответ 5

Я отсылаю вас к вопросу, который я задал ранее: Как определить, когда Selenium загружает страницу с ошибкой браузера

Короче говоря, если вы не хотите, чтобы uber придумал что-то вроде прокси-сервера squid или браузера, тогда вам нужно пойти на грязное решение, как показано ниже.

Заменить

driver.get( "http://google.com" )

с

def goTo( url ):
    if "errorPageContainer" in [ elem.get_attribute("id") for elem in driver.find_elements_by_css_selector("body > div") ]:
        raise Exception( "this page is an error" )
    else:
        driver.get( url )

Вы можете получить объявление и получить код ошибки на основе текста, отображаемого в фактическом браузере. Это нужно настроить на основе браузера; один выше работает для firefox.

Единственный способ, которым это становится проблематичным, - это 404 (страница не найдена), поскольку на многих сайтах есть свои собственные страницы ошибок, и вы должны настроить их для каждого.

Ответ 6

Я использую java здесь, так как у меня не так много опыта в Python. Кроме того, я не знаю, как получить только коды статуса http. После этого вы получите весь сетевой трафик, вы можете получить коды статуса из него.

Сначала запустите сервер как

selenium.start("captureNetworkTraffic=true");

Затем запишите свой трафик как

String traffic = selenium.captureNetworkTraffic("xml");

Вы также можете получить вывод в json.

Ответ 8

Вы также можете проверить последнее сообщение в журнале на наличие кода ошибки: print browser.get_log('browser')[-1]['message']

Ответ 9

Да, можно получить http status code с помощью Selenium Python вместе с API запросов Python следующим образом:

  • В качестве примера для проверки status_code Gmail на веб-странице https://www.google.co.in/ вы можете использовать следующее решение:

    import requests
    from selenium import webdriver
    
    options = webdriver.ChromeOptions() 
    options.add_argument("start-maximized")
    options.add_argument('disable-infobars')
    driver=webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
    driver.get('https://google.co.in/')
    link = driver.find_element_by_link_text("Gmail")
    r = requests.head(link.get_attribute('href'))
    print(link.get_attribute('href'), r.status_code)
    
  • Консольный вывод:

    https://mail.google.com/mail/?tab=wm 302