2010-08-16 20 views
6

Jak uzyskać dzienniki żądań/odpowiedzi w selen? Mam wywołanie ajax, która zwraca dane logowania, a gdy próbuję uchwycić go za pomocą:Jak uzyskać nagłówki odpowiedzi w Selenium?

selenium.captureNetworkTraffic("json"); 

zwraca tylko te elementy po stronie klienta (takich jak obrazy .pn), ale nie rzeczywista odpowiedź JSON jestem zainteresowany in.

+0

może mi pomóc, myślałem, że selen powinien mieć kliknięcia wykonane wewnątrz i odpowiedź od niego? czy ktoś nie próbował tego? – sasikumar

Odpowiedz

8

Niestety, nie wygląda na to, że można zrobić to samo z selenem w sposób zautomatyzowany, ponieważ jest to against their design principles for selenium. Nie zgadzam się, że tak jest (skoro obsługuje on otrzymywanie informacji o plikach cookie - o tym, co użytkownik faktycznie przegląda i analizuje pliki cookie?).

Ich "schtick" polega na tym, że selen pomaga zautomatyzować to, co robi użytkownik; ponieważ użytkownik nie dba o nagłówki odpowiedzi, dlaczego miałby taką strukturę? Dla mnie jest to niezadowalające, ponieważ muszę zadbać o to, aby zwracany typ treści był dokładnie taki, jak sądzę (testowanie interfejsu API). Wygląda na to, że another Stack Overflow question doszedł do podobnego wniosku.

0

znalazłem trick jeśli używasz jQuery można zarejestrować globalną słuchacza:

najpierw trzeba zadeklarować zmienną globalną w głównym skrypcie:

var globalVariableForSelenium = ""; 

w twojej selenu zarejestrowaniu słuchacza :

if (driver instanceof JavascriptExecutor) { 
       ((JavascriptExecutor) driver) 
       .executeScript("$(document).ajaxSuccess(function(event, xhr, settings) { globalVariableForSelenium = settings.headers });"); 
      } 

Następnie należy wykonać swoją czynność

Finaly uzyskać wartość zmiennej globalnej:

if (driver instanceof JavascriptExecutor) { 
      Object res = ((JavascriptExecutor) driver) 
      .executeScript("return serializeGlobalvariable();"); 

} 

serializeGlobalvariable() jest funkcją, która będzie szeregować globalVariableForSelenium która zawiera tablicę cel.

ps: moja potrzeba było, aby uzyskać dostęp do odpowiedzi ajax tak ustawić zmienną globalną z xhr.responseJSON.mypath

1

Zdaję sobie sprawę, że kwestia ta jest stara jak cholera, ale już opracowany sposób to zrobić to dla firefox + selenu poprzez modyfikację webdriver.xpi i tworzenie driver.http_logger.variousLogMethods(). Proszę odpowiedzieć na ten post, jeśli jest w tym zainteresowanie i mogę wysłać kod do github.

+0

Jestem zainteresowany. Opublikuj link do github. –

+0

@ user2426679 Jestem również zainteresowany, czy mógłbyś pokazać mi na Githubie jak to zrobić? – David542

+0

@ David542 - W końcu udało mi się załadować ten mały projekt. Zrobiłem to jakiś czas temu, więc dokumentacja jest skąpa. https://bitbucket.org/stbrownlow/seleniumwithfirefoxhttplogging/src – user2426679

1

Można to zrobić poprzez wstrzyknięcie XMLHttpRequest i czeka na wynik:

Object response = ((JavascriptExecutor) driver).executeAsyncScript(
     "var callback = arguments[arguments.length - 1];" + 
     "var xhr = new XMLHttpRequest();" + 
     "xhr.open('GET', '/resource/data.json', true);" + 
     "xhr.onreadystatechange = function() {" + 
     " if (xhr.readyState == 4) {" + 
     " callback(xhr.getResponseHeader());" + 
     " }" + 
     "};" + 
     "xhr.send();"); 
    JsonObject json = new JsonParser().parse((String) response); 
    assertEquals("cheese", json.get("food").getAsString()); 

Można zmodyfikować zwrotnego XHR aby dostać to, czego chcesz.

Powiązane problemy