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.
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:
Il nous reste des bidouilles comme:
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.
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".
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']
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.
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.
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
Vous pouvez également rechercher dans le dernier message du journal un code d'état d'erreur: print browser.get_log('browser')[-1]['message']