2016-05-19 39 views
5

Sto eseguendo alcuni unittests con Selenium Webdriver.Come passare correttamente l'autenticazione di base (ogni clic) utilizzando Selenium e phantomjs webdriver

Ho un intero test che viene eseguito con successo utilizzando webdriver.Firefox(), ecco il programma di installazione:

def setUp(self): 
    self.driver = webdriver.Firefox() 
    self.driver.implicitly_wait(30) 
    self.base_url = "http://www.nike.com" 
    self.verificationErrors = [] 
    self.accept_next_alert = True 

Il test viene eseguito con successo, però devo inserire manualmente più volte autenticazione base per il test per continuare ad andare avanti.

Nel tentativo di aggirare autenticazione di base e avere l'intero test veramente automatizzato, ho acceso da Firefox a phantomjs, come sembra, come si può passare in Basic Auth con ogni clic()

Qui è la mia messa a punto dopo il passaggio a phantomjs:

def setUp(self): 
    dcap = dict(DesiredCapabilities.PHANTOMJS) 
    dcap["phantoms.page.settings.userName"] = ("testuser") 
    dcap["phantoms.page.settings.userPassword"] = ("testpass") 
    self.driver = webdriver.PhantomJS(desired_capabilities=dcap, service_args=['--ignore-ssl-errors=true']) 
    self.driver.implicitly_wait(30) 
    self.base_url = "http://www.nike.com 
    self.verificationErrors = [] 
    self.accept_next_alert = True 

ma ottengo il seguente errore:

NoSuchElementException: Message: {"errorMessage":"Unable to find 
element with xpath '(//button[@type='button'])[2]'","request": 
{"headers":{"Accept":"application/json","Accept-Encoding":"identity", 
"Connection":"close","Content-Length":"113","Content- Type":"application/json;charset=UTF-8", 
"Host":"127.0.0.1:58025","UserAgent":"Pythonurllib/2.7"},"httpVersion":"1.1", 
"method":"POST","post":"{\"using\": \"xpath\", \"sessionId\": \"c2fa02e0-1df0-11e6-a2ad-c325e56df16d\", 
\"value\": \"(//button[@type='button'][2]\"}","url":"/element","urlParsed": 
{"anchor":"","query":"","file":"element","directory":"/","path":"/element","relative":"/element","port":"","host":"", 
"password":"","user":"","userInfo":"","authority":"","protocol":"","source":"/element","queryKey":{},"chunks":  
["element"]},"urlOriginal":"/session/c2fa02e0-1df0-11e6-a2ad-c325e56df16d/element"}} 

io non sono sicuro se questo errore è solo una differenza tra phantomjs e Firefox, o se sto solo passando in modo errato.

risposta

4

Ecco il modo per definire il token di autenticazione di base nelle intestazioni con PhantomJS e selenio:

from selenium import webdriver 
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities 
import base64 

authentication_token = "Basic " + base64.b64encode(b'username:password') 

capa = DesiredCapabilities.PHANTOMJS 
capa['phantomjs.page.customHeaders.Authorization'] = authentication_token 
driver = webdriver.PhantomJS(desired_capabilities=capa) 

driver.get("http://...") 
+0

Grazie, sarà presente quindi passare l'authentication_token su ogni successivo click? – david

+0

Sì se il clic è un collegamento a una nuova pagina, ma non sono sicuro per una chiamata Ajax. –

+1

Ho accettato la risposta, tuttavia questo non ha risolto il problema poiché l'autenticazione di base è richiesta da più host (il contenuto incorporato nella pagina richiede la sua autenticazione di base). Non sono sicuro che ci sia un modo per passare credenziali a più host in questo modo usando Selenium, pensavo che i phantomjs avrebbero offerto una soluzione alternativa, ma non credo. – david