web-dev-qa-db-fra.com

Comment obtenir le code d'état en utilisant Selenium.py (code python)

J'écris un script Selenium en python, mais je ne vois aucune information sur:

Comment obtenir le code de statut http à partir du code Selenium Python

Ou je manque quelque chose. Si quelqu'un trouve cela, n'hésitez pas à poster.

23
maa_modd

Ce n'est pas possible.

Malheureusement, Selenium ne fournit pas cette information de par sa conception. Il y a une très longue discussion à ce sujet, mais en bref, c'est que:

  1. Selenium est un outil d'émulation de navigateur, pas nécessairement un outil de test.
  2. Selenium exécute many GETs et POST pendant le processus de rendu d'une page et l'ajout d'une interface, ce qui compliquerait l'API de la façon dont les auteurs résistent.

Il nous reste des bidouilles comme:

  1. Recherchez les informations d'erreur dans le code HTML renvoyé.
  2. Utilisez plutôt un autre outil comme Requests (mais voyez les inconvénients de cette approche dans la réponse de @ Zeinab.
24
mlissner

Je surfe sur le net depuis environ 3 heures et je n’ai trouvé aucun moyen de le faire avec Web-driver. Je n'ai jamais travaillé directement avec Selenium. La seule suggestion qui m'est venue à l'esprit est d'utiliser des "requêtes" de module comme ceci:

import requests
from Selenium import webdriver

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

Le didacticiel complet sur l’utilisation des demandes est ici et vous pouvez installer le module à l’aide de la commande pip install requests.

Mais il y a un problème qui peut ne pas toujours se produire, mais vous devez cibler la réponse de ce conducteur et la réponse de la demande n'est pas la même; vous obtenez donc simplement le code d'état de la demande et, si les réponses ne sont pas stables, les résultats sont probablement erronés.

7

Je n'ai pas beaucoup d'expérience avec Python. J'ai un exemple Java plus détaillé ici:

https://stackoverflow.com/a/39979509/5703420

L'idée est d'activer la journalisation des performances. Cela déclenche "Network.enable" sur chromedriver. Obtenez ensuite les entrées du journal de performances et analysez-les pour le message "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)

La sortie contiendra "Network.responseReceived" pour votre URL, les autres requêtes effectuées par le chargement de la page ou les URL de redirection. Tout ce que vous avez à faire est d’analyser les entrées du journal.

'{"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"}'}

et obtenez "status": 200 dans la réponse json. Vous pouvez également analyser la réponse "en-têtes".

6
Stefan Matei

Il semble possible d'obtenir le code d'état de la réponse à partir du journal via l'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']
4
Mma

Je vous renvoie à une question que j'ai posée précédemment: Comment détecter le moment où Selenium charge la page d'erreur d'un navigateur

En résumé, à moins que vous ne vouliez vous faire trop plaisir avec quelque chose comme un proxy squid ou une navigateur, vous devez alors opter pour une solution sale, comme ci-dessous.

Remplacer

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

avec

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 )

Vous pouvez faire preuve de créativité et obtenir le code d'erreur en fonction du texte affiché dans le navigateur actuel. Cela devra être personnalisé en fonction du navigateur; celui ci-dessus fonctionne pour firefox. 

Cela devient problématique uniquement avec 404 (page non trouvée), car de nombreux sites ont leurs propres pages d'erreur et vous devez le personnaliser pour chacun.

2
user2426679

J'utilise Java ici car je n'ai pas beaucoup d'expérience en Python. De plus, je ne sais pas comment obtenir uniquement les codes de statut http. La suite vous donnera tout le trafic réseau, vous pouvez capturer les codes de statut de celui-ci. 

Commencez par démarrer votre serveur en tant que 

Selenium.start("captureNetworkTraffic=true");

Puis capturez votre trafic comme 

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

Vous pouvez également obtenir une sortie en format json. 

1
9ikhan

Corey Goldberg a eu une excellente implémentation d’un profileur utilisant Selenium et Python pour produire un résultat formaté. Voici le lien.

http://coreygoldberg.blogspot.com/2009/10/automated-webhttp-profiler-with.html

1
rs79

Vous pouvez également rechercher dans le dernier message du journal un code d'état d'erreur: print browser.get_log('browser')[-1]['message']

0
etayluz