2016-05-19 2 views
5

Ich betreibe einige Unittests mit Selenium Webdriver.Wie man Grundauthentifizierung (jeden Klick) mit Selenium und Phantomjs Webdriver korrekt passiert

ich einen ganzen Test haben, die erfolgreich mit webdriver.Firefox läuft(), hier ist das Setup:

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 

Der Test erfolgreich verläuft, jedoch muss ich manuell in Grund Auth mehrfach für den Test eingeben um vorwärts zu kommen.

In einem Versuch, grundlegende auth zu umgehen und der gesamte Test wirklich automatisiert haben, ich habe von Firefox zu PhantomJS umgeschaltet, wie es klingt wie Sie in Basic Auth mit jedem Klick()

Hier ist mein Setup passieren kann nach dem PhantomJS Schalt:

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 

Aber ich erhalte die folgenden Fehler:

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

ich bin nicht sicher, ob dieser Fehler nur ein Unterschied zwischen PhantomJS ist und firefox, oder wenn ich gerade auth fälschlicherweise passiere.

Antwort

4

Hier ist der Weg, um die grundlegenden Authentifizierungstoken in den Headern mit PhantomJS und Selen zu definieren:

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

Dank, wird diese dann auf jedem aufeinanderfolgenden Klick die authentication_token passieren? – david

+0

Ja, wenn der Klick ein Link zu einer neuen Seite ist, aber ich bin mir nicht sicher für einen Ajax-Anruf. –

+1

Ich habe Ihre Antwort akzeptiert, dies führte jedoch nicht zur Lösung meines Problems, da die Basisauthentifizierung von mehreren Hosts angefordert wird (eingebetteter Inhalt auf der Seite erfordert eine eigene Basisauthentifizierung). Ich bin nicht sicher, ob es eine Möglichkeit gibt, Anmeldeinformationen an mehrere Hosts auf diese Weise mit Selenium zu übergeben, ich dachte Phantomjs würde einen Workaround bieten, aber ich denke nicht. – david