2016-05-19 21 views
5

Używam kilku prób z Selenium Webdriver.Jak poprawnie przejść podstawowe uwierzytelnianie (każde kliknięcie) za pomocą Selenium i phantomjs webdriver

Mam cały test, który działa skutecznie przy użyciu webdriver.Firefox(), oto konfiguracja:

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 

Test przebiega pomyślnie, jednak muszę ręcznie wpisać w podstawowych auth wiele razy do testu aby iść do przodu.

W próbie ominięcia podstawowego uwierzytelniania i mają całe badanie prawdziwie zautomatyzowany, mam włączony od Firefoksa phantomjs, jak to brzmi jak można przekazać Basic Auth z każdego kliknięcia()

Oto moja konfiguracja po włączeniu do 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 

ale pojawia się następujący błąd:

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

nie jestem pewien, czy ten błąd jest tylko różnica między phantomjs i firefox, lub jeśli właśnie przekazuję auth niepoprawnie.

Odpowiedz

4

Oto sposób, aby zdefiniować podstawowe token uwierzytelniania w nagłówkach z PhantomJS i selen:

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

Dzięki, to następnie przekazać authentication_token na każdym kolejnym kliknięciem? – david

+0

Tak, jeśli kliknięcie jest linkiem do nowej strony, ale nie jestem pewien, czy jest to połączenie Ajax. –

+1

Zaakceptowałem twoją odpowiedź, ale to nie rozwiązało mojego problemu, ponieważ podstawowe żądanie jest wymagane od wielu hostów (zawartość osadzona na stronie wymaga własnego podstawowego uwierzytelnienia). Nie jestem pewien, że istnieje sposób przekazywania poświadczeń do wielu hostów w ten sposób przy użyciu Selenium, myślałem, że phantomjs zaoferuje obejście, ale nie sądzę. – david