2013-07-09 19 views
12

Zastanawiam się, czy ktokolwiek mógłby rozwinąć się w którejkolwiek z tych prób lub ma jakieś inne pomysły na uchwycenie błędów JS przy użyciu WebDriver, który będzie działał w Firefoksie, Chrome, Internet Explorerze i Safari.Złap błędy JavaScript w Selenium WebDriver - Niezależnie od przeglądarki

Oto co zostało próbowałem dotąd:
Próba - Problem:

JSErrorCollector.jar - Działa dobrze, ale to tylko Firefox rozwiązanie.

Inject JS do źródła strony - I wstrzykuje kod window.onerror w kodzie źródłowym strony Korzystanie WebDriver, ale wszelkie początkowe błędy są pominięte, ponieważ wtrysk jest zbyt późno.

BrowserMob - mogę przechwycić odpowiedź HTTP i planuje wprowadzić kod do ciała reakcji window.onerror, ale autor nie wdrożyła jeszcze metodę getBody(), więc tylko nagłówki mogą być modyfikowane, że jestem świadomy. Ciało jest zawsze puste dla wszystkich odpowiedzi. (Byłem na stronie internetowej, gdzie autor opowiadał o wdrażaniu getBody() ale to jeszcze nie stało i nie mogę go odnaleźć)

Skrzypek - JS wstrzyknie poprawnie, ale Skrzypek jest Windows tylko tak Safari nie będzie praca.

Okna rodzica/dziecka - Używam javascript do otwierania i przechowywania odniesienia do okna strony testowej. window.onerror code znajduje się w oknie nadrzędnym, dzięki czemu nie ominie błędów uruchamiania w oknie podrzędnym. Nie mogę tego sprawić, żeby działał w czymkolwiek poza Firefoksem i Chome. Zadałem już pytanie na ten temat: here.

Selen RC - Nie próbowałem go, ponieważ wszystkie moje testy używać WebDriver, ale wiem, że ma jakieś metody jak captureNetworkTraffic(), ale nie sądzę, może on być stosowany w WebDriver.

Wyskakujące okienka błędów IE - Zamierzałem użyć rozwiązania parent/child dla przeglądarki Firefox/Chrome, a następnie wyszukać komunikat o błędzie IE. To wyskakujące okienko wyświetla się, gdy ustawienie jest zaznaczone, aby je wyświetlić. Popup jest rodzimym oknem okna (chyba), więc nie mogę użyć selenu, aby uzyskać do niego dostęp.

Przeczytaj konsolę przeglądarki - Nie mogłem znaleźć tego sposobu we wszystkich przeglądarkach. W Chrome znalazłem sposób na zapisanie dziennika konsoli w pliku, a następnie odczytanie pliku. To tyle, ile mam.

Chciałbym rozwiązania podobnego do BrowserMob, ponieważ wydaje się, że byłoby to rozwiązanie z przeglądarki krzyżowej. Czy są jakieś inne proxy, które można umieścić w teście i przechwycić odpowiedź? Byłoby wspaniale, gdyby zaimplementowano metodę getBody(). Podoba mi się również rozwiązanie parent/child, ponieważ wydaje się ono również prostym rozwiązaniem dla przeglądarki, ale nie działa dla IE (parent/child question again).

Dzięki za pomoc.

+1

Z tego co wiem, wymieniłeś wszystkie możliwe obecnie dostępne rozwiązania (lipiec 2013, Selenium 2.33.0). [Zobacz oficjalny błąd Selenium, aby uzyskać więcej informacji.] (Http://code.google.com/p/selenium/issues/detail?id=148) Dopóki nie ma oficjalnego API, musisz użyć kombinacji tych rozwiązania lub prawdopodobnie napisać własny dodatek do przeglądarki dla każdej przeglądarki, którą potrzebujesz obsługiwać. –

+0

Dzięki za link. – Ryan

+2

Zdajesz sobie sprawę, że proxy BrowserMob to [open-source] (https://github.com/lightbody/browsermob-proxy), prawda? Co powstrzymuje Cię przed wdrożeniem brakującej funkcji i przesłaniem prośby o odłożenie? – JimEvans

Odpowiedz

1

Nie wiem w żaden sposób, aby bezpośrednio uchwycić błędy kodu JavaScript przez strukturę testową. Gdybym zgadywał, użyłbym PhantomJS. A może zadziała coś takiego jak MITM Proxy?

W razie uruchomienia Selenium2 Grid Hub z oddzielnym węzłem, można przekazać opcję Java do wirtualnej maszyny wirtualnej takiego węzła, która pozwoli na działanie proxy za pośrednictwem narzędzia Skrzypek. Fiddler nasłuchuje (domyślnie) na porcie 8888. Dzięki tej metodzie możesz oglądać pakiety.

:: batch script: Set JAVA_OPTS java options to JVM 
SET "JAVA_OPTS=-Dwebdriver.chrome.^ 
driver=%CHROMEDRIVER%" 
IF "%PROXY_TO_FIDDLER%"=="true" SET "JAVA_OPTS=%JAVA_OPTS% -DproxySet=true^ 
-Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=8888" 

Utworzono scripts you can use to start your grid and node here. Wydaje mi się, że możesz użyć tej metody do rozmowy z serwerem proxy BrowserMob na porcie 8080? Nie próbowałem tego.

+0

Używam teraz Fiddlera do oglądania pakietów, ale nie mam konfiguracji siatki. Zajrzę do twojego kodu. Dzięki za odpowiedź/kod. – Ryan

+0

Domyślam się, że źródło strony nie przechodzi między węzłem siatki a węzłem. Każda sesja przeglądarki internetowej w instancji węzła, która napotkał błąd Javascript, znajduje się w jego własnym obszarze izolowanym. Twój pomysł użycia zastrzyku JQuery wydaje mi się jedynym sposobem, aby to zrobić, ale wiem, że powiedziałeś, że nie wcześnie wychwytuje błędy. Teoretyzuję, ale może mógłbyś załadować swoją stronę w ramce strony testowej opakowania iFrame, która wstępnie ładuje jquery i kontroluje/ogląda ładowanie strony w jej elemencie iframe? W takim przypadku kierowca testowy musiałby wykonać switchTo, aby dostać się do ramy. – djangofan

Powiązane problemy