Uwierzytelnianie proxy w Selenium staje się trudne, gdy przeglądarka – a nie strona internetowa – prosi o nazwę użytkownika i hasło. Właściwe rozwiązanie zależy od typu proxy, przeglądarki, wersji Selenium oraz od tego, czy dane uwierzytelniające można podać poza testem. W tym przewodniku wyjaśniono niezawodne podejścia Selenium 4, gdzie nadal sprawdzają się starsze obejścia, oraz dlaczego kod obsługi alertów często zawodzi.
Co to jest pełnomocnik?
Serwer proxy to pośrednik, który wysyła żądania do stron internetowych w imieniu przeglądarki. Miejsce docelowe widzi adres IP serwera proxy zamiast komputera, na którym działa Selenium. Zespoły testujące używają serwerów proxy do walidacji regionalnych doświadczeń, kierowania ruchem przez kontrolowane sieci, inspekcji żądań lub dystrybucji zautomatyzowanych obciążeń.
Adres URL serwera proxy zazwyczaj zawiera hosta i port, np. proxy.example.test:8080Usługi prywatne mogą również wymagać nazwy użytkownika i hasła. Selenium może skonfigurować punkt końcowy proxy za pomocą opcji przeglądarki, ale monity uwierzytelniające są kontrolowane przez przeglądarkę i nie zawsze są widoczne dla WebDriver, jak w przypadku zwykłego formularza HTML.
Używaj automatyzacji tylko wtedy, gdy masz do tego upoważnienie, przestrzegaj warunków witryny i nie udostępniaj danych uwierzytelniających w kodzie źródłowym ani w dziennikach testów.
Różnica między SOCKS a serwerem proxy HTTP
Serwery proxy HTTP rozpoznają ruch sieciowy i są zazwyczaj konfigurowane z oddzielnymi wartościami HTTP i HTTPS. Serwery proxy SOCKS działają na niższym poziomie i mogą obsługiwać różne rodzaje ruchu TCP bez interpretowania protokołu aplikacji. SOCKS5 dodatkowo obsługuje uwierzytelnianie i jest zazwyczaj preferowaną wersją protokołu SOCKS.
| Charakterystyka | Serwer proxy HTTP/HTTPS | Serwer proxy SOCKS5 |
|---|---|---|
| Ruch | Zaprojektowany dla żądań przeglądarek internetowych | Współpracuje z wieloma aplikacjami opartymi na protokole TCP |
| Świadomość protokołu | Rozumie żądania i nagłówki HTTP | Przekazuje ruch bez odczytywania semantyki HTTP |
| Konfiguracja Selenium | Ustaw pola proxy HTTP i SSL | Ustaw punkt końcowy i wersję SOCKS |
| Typowe zastosowanie | Testowanie stron internetowych, filtrowanie, buforowanie, inspekcja | Elastyczne tunelowanie i ruch inny niż HTTP |
Przeglądarka i dostawca proxy muszą obsługiwać tę samą metodę. Prawidłowy punkt końcowy nie gwarantuje, że Selenium automatycznie ukończy natywne okno dialogowe z nazwą użytkownika i hasłem.
Jak obsługiwać serwer proxy w Selenium Webdriver w Chrome
W przypadku serwera proxy, który nie wymaga uwierzytelniania interaktywnego, Selenium 4 może przypisać Proxy oponować ChromeOptions. Obecny oficjalna dokumentacja opcji przeglądarki Selenium demonstruje podejście oparte na zdolnościach.
import org.openqa.selenium.Proxy;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
Proxy proxy = new Proxy();
proxy.setHttpProxy("proxy.example.test:8080");
proxy.setSslProxy("proxy.example.test:8080");
ChromeOptions options = new ChromeOptions();
options.setProxy(proxy);
WebDriver driver = new ChromeDriver(options);
driver.get("https://example.com");
W przypadku SOCKS5 należy zamiast tego ustawić punkt końcowy i wersję SOCKS:
Proxy proxy = new Proxy();
proxy.setSocksProxy("proxy.example.test:1080");
proxy.setSocksVersion(5);
ChromeOptions options = new ChromeOptions();
options.setProxy(proxy);
Uwierzytelnione serwery proxy wymagają dodatkowego planowania. Osadzanie danych uwierzytelniających w adresie URL może zostać odrzucone przez nowoczesne przeglądarki i ujawnić poufne dane. Preferuj następujące podejścia:
- Lista dozwolonych adresów IP: autoryzuj stały publiczny adres IP swojego modułu CI lub węzła Selenium Grid, aby nie pojawiało się okno dialogowe przeglądarki.
- Brama lokalna: Umieść zaufany serwer proxy przekierowujący na komputerze testowym. Selenium łączy się lokalnie bez uwierzytelniania, a brama uwierzytelnia się w górę strumienia.
- Kontrolowane rozszerzenie przeglądarki: Utwórz wewnętrzne rozszerzenie Chrome, które konfiguruje serwer proxy i odpowiada na pytania dotyczące uwierzytelniania. Wczytaj je tylko z chronionego artefaktu testowego.
- Konfiguracja na poziomie siatki: skonfiguruj sieć i sekrety na węźle Selenium zamiast rozsyłać dane uwierzytelniające do każdego testu.
Odczytaj dane uwierzytelniające z menedżera sekretów lub konfiguracji testowej specyficznej dla środowiska. Nigdy nie zatwierdzaj ich w Git, nie zapisuj w konsoli ani nie umieszczaj na zrzutach ekranu. Po uruchomieniu zweryfikuj adres IP wyjścia z zatwierdzonym punktem końcowym testu, zanim przejdziesz dalej.
ERR_PROXY_CONNECTION_FAILED zwykle oznacza, że host, port, protokół lub ścieżka sieciowa są nieprawidłowe. Powtarzające się 407 Proxy Authentication Required odpowiedzi wskazują na brakujące lub odrzucone dane uwierzytelniające.Korzystanie z narzędzia AutoIt
AutoIt może automatyzować okna dialogowe systemu Windows poprzez zlokalizowanie okna, wpisanie danych uwierzytelniających i naciśnięcie przycisku. Kiedyś było to powszechne obejście problemu w Selenium, ponieważ WebDriver nie mógł obsługiwać okien uwierzytelniania należących do przeglądarki.
Ta metoda jest krucha: działa tylko w systemie Windows, wymaga odblokowanego interaktywnego pulpitu, zależy od tytułów okien i czasu ich działania oraz zazwyczaj zawodzi w kontenerach bez interfejsu użytkownika lub zdalnych agentach CI. Może również ujawniać hasła za pomocą skryptów lub argumentów procesów.
Jeśli starsze środowisko nie pozostawia alternatywy, skompiluj skrypt AutoIt, zapisz go w kontrolowanej lokalizacji artefaktów testowych, bezpiecznie pobierz dane uwierzytelniające w czasie wykonywania i poczekaj na odpowiedni dialog, zamiast korzystać ze stałego trybu uśpienia. Ogranicz tę technikę do odizolowanego serwera Windows. W przypadku łatwych w utrzymaniu pakietów, bezpieczniejszymi opcjami są lista dozwolonych adresów IP, brama lub centralnie skonfigurowane węzły Grid.
Korzystanie z alertów
Selenium może obsługiwać alerty JavaScript tworzone przez kod strony internetowej:
Alert alert = new WebDriverWait(driver, Duration.ofSeconds(10))
.until(ExpectedConditions.alertIsPresent());
alert.accept();
Jednak okno dialogowe uwierzytelniania serwera proxy jest zazwyczaj wyświetlane w przeglądarce Chrome, a nie w alercie JavaScript. Dlatego driver.switchTo().alert() często rzuca NoAlertPresentException nawet gdy widoczny jest monit o podanie danych uwierzytelniających. To samo ograniczenie dotyczy wielu okien dialogowych uwierzytelniania podstawowego HTTP.
Użyj interfejsu API alertów dopiero po potwierdzeniu, że WebDriver rozpoznaje monit. Jeśli nie, usuń monit poprzez konfigurację sieci lub skorzystaj z jednej z metod uwierzytelniania proxy opisanych powyżej. Jest to bardziej stabilne niż koordynowanie naciśnięć klawiszy z oknem, którego Selenium nie może sprawdzić.
FAQ
Czy Selenium może bezpośrednio ustawić serwer proxy?
Tak. Selenium 4 może przekazywać ustawienia HTTP, SSL lub SOCKS przez opcje przeglądarki i funkcję proxy. To konfiguruje punkt końcowy, ale może nie zakończyć monitu uwierzytelnienia w przeglądarce.
Dlaczego w Chrome nie działa polecenie username:password@host:port?
Nowoczesne przeglądarki mogą blokować dane uwierzytelniające osadzone w adresach URL, a ich składnia może powodować wyciek poufnych informacji do logów i historii. Zamiast tego należy korzystać z listy dozwolonych adresów IP, bezpiecznej bramy lub kontrolowanej infrastruktury testowej.
Czy Selenium poradzi sobie z logowaniem proxy za pomocą switchTo().alert()?
Zazwyczaj nie. Uwierzytelnianie proxy odbywa się zazwyczaj za pośrednictwem interfejsu użytkownika przeglądarki, a nie alertu JavaScript, dlatego WebDriver może zgłaszać brak alertu.
Czy uwierzytelnianie proxy działa w przeglądarce Chrome bez interfejsu graficznego?
Może działać, gdy uwierzytelnianie jest rozwiązywane bez interaktywnego monitu. Lista dozwolonych adresów IP, lokalna brama lub konfiguracja na poziomie węzła lepiej sprawdzają się w przypadku wykonywania bezgłowego.
Czy powinienem używać AutoIt do uwierzytelniania proxy Selenium?
Używaj go tylko w przypadku ograniczonego przepływu pracy w starszym systemie Windows. Jest on kruchy w CI i mniej bezpieczny niż eliminacja dialogu poprzez konfigurację sieci.
Który typ serwera proxy jest najlepszy do automatyzacji przeglądarki?
Zależy to od autoryzowanego zadania. Serwery proxy HTTP są proste w obsłudze ruchu internetowego, SOCKS5 jest elastyczny, a sieci domowe mogą pomóc w testowaniu lokalizacji. Porównaj opcje w naszym przewodniku po typach serwerów proxy.
