Niedawno zaktualizowaliśmy nasze środowisko testowe o ChromeDriver w wersji 80.0.3987.16 i Chrome w wersji 80.0.3987.87 (oficjalna wersja) (wersja 64-bitowa), a po aktualizacji nawet minimalny program generuje wiele ZNAKOWYCH dzienników:
[1581082019.282][SEVERE]: Timed out receiving message from renderer: 0.100
[1581082020.245][SEVERE]: Timed out receiving message from renderer: 0.100
Wcześniej te komunikaty były obserwowane od czasu do czasu z kombinacją ChromeDriver v79.0 / Chrome v79.0.
Minimalny blok kodu:
public class chromeDemo
{
public static void main(String[] args)
{
System.setProperty("webdriver.chrome.driver", "C:\\Utility\\BrowserDrivers\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("https://www.google.com/");
driver.quit();
}
}
Dane wyjściowe konsoli:
Starting ChromeDriver 80.0.3987.16 (320f6526c1632ad4f205ebce69b99a062ed78647-refs/branch-heads/3987@{#185}) on port 9194
Only local connections are allowed.
Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code.
Feb 07, 2020 6:56:57 PM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: W3C
[1581082019.282][SEVERE]: Timed out receiving message from renderer: 0.100
[1581082020.245][SEVERE]: Timed out receiving message from renderer: 0.100
[1581082020.430][SEVERE]: Timed out receiving message from renderer: 0.100
[1581082020.531][SEVERE]: Timed out receiving message from renderer: 0.100
[1581082020.632][SEVERE]: Timed out receiving message from renderer: 0.100
[1581082020.734][SEVERE]: Timed out receiving message from renderer: 0.100
[1581082020.835][SEVERE]: Timed out receiving message from renderer: 0.100
[1581082021.364][SEVERE]: Timed out receiving message from renderer: 0.100
[1581082021.544][SEVERE]: Timed out receiving message from renderer: 0.100
[1581082021.647][SEVERE]: Timed out receiving message from renderer: 0.100
[1581082021.748][SEVERE]: Timed out receiving message from renderer: 0.100
[1581082021.850][SEVERE]: Timed out receiving message from renderer: 0.100
[1581082021.952][SEVERE]: Timed out receiving message from renderer: 0.100
Ktoś stoi przed tym samym? Czy była jakaś zmiana w ChromeDriver / Chrome v80 w stosunku do ChromeDriver / Chrome v79? Jakieś wskazówki?
Odpowiedzi:
Rozwiązanie tymczasowe
Oto rozwiązania dla różnych wariantów użytkowników Chrome .
Jeśli używasz Chrome v80 , użycie ostatnio wydanego ChromeDriver 80.0.3987.106 rozwiązuje problem.
Blok kodu:
Dane wyjściowe konsoli:
Jeśli używasz Chrome v81 , użycie ostatnio wydanego ChromeDriver 81.0.4044.20 rozwiązuje problem.
Trwałe rozwiązanie
Jednak
@bugdroid
przesłano rzeczywistą poprawkę za pośrednictwem tej zmiany / zatwierdzenia, która jest następująca:Uwaga :
Historia
Ten komunikat o błędzie ...
... niekoniecznie oznacza awarię.
Jak wspomniała @Tricia , ChromeDriver w wersji 80 zmodyfikował pętlę oczekiwania, aby umożliwić więcej prób; ta pętla wygeneruje ten komunikat, ale nadal będzie nasłuchiwać. Jednak znacznik SEVERE dla tej wiadomości wprowadza w błąd.
Ponadto w dyskusji Problem 3332: Ponowna próba przekroczenia limitu czasu zarejestrowana jako poważna , @triciac [ChromeDriver Committer] również dodał, że zespół ChromeDriver dodał niewielki limit czasu (100 ms),
DevToolsClientImpl::HandleEventsUntil
aby umożliwić dodatkowe sprawdzanie stanu nawigacji. Niestety, gdy upłynął limit czasu, jest on rejestrowany jako SEVERE (wgProcessNextMessage
). W przypadku tego krótkiego limitu czasu nie powinien on rejestrować się jako SEVERE , chociaż limity czasuSendCommandInternal
nadal powinny.Dlatego ChromeDriver potrzebuje sposobu na lepszą kontrolę logowania, prawdopodobnie poprzez zwiększenie limitu czasu. Jeśli jednak polecenie w końcu się skończy, a limit czasu na liście jest bardzo krótki, wówczas należy podać limit czasu zdefiniowany przez użytkownika.
Natychmiastowe rozwiązanie
Jako rozwiązanie tymczasowe możesz obniżyć wersję ChromeDriver do wersji 79.0.3945.36, ponieważ wydaje się, że DOWOLNE dzienniki nie pojawiają się w konsoli, ale zobaczysz OSTRZEŻENIE :
co brzmi jak ... bezpieczne obejście ... i zostało potwierdzone przez członka zespołu Chromium .
Blok kodu:
Dane wyjściowe konsoli:
tl; dr
Kilka istotnych dyskusji można znaleźć w:
źródło
vstest.console.exe
ponieważ$?
zmienna PowerShell była$false
mimo, że testy przeszły pomyślnie. Wydaje się, że PowerShell uważa, że cokolwiek napisane do stderror jest błędem, nawet jeśli$LastExitCode
dla testera runner zwrócił zero.Główna przyczyna: Ilekroć ładujesz jakąś stronę za pomocą sterownika selenu, wtedy
driver
skrypt zaczekaj, aż strona zostanie całkowicie załadowana. Ale czasami webdriver potrzebuje więcej czasu na załadowanie strony, w takim przypadku zobaczyszTimeoutException
wyjątek w konsoli.Rozwiązanie: Gdy ładowanie strony zajmuje zbyt dużo czasu i musisz przestać pobierać dodatkowe zasoby podrzędne (obrazy, css, js itp.) , Możesz zmienić pageLoadStrategy za pośrednictwem webdriver.
Poniżej kodu wystarczy załadować zawartość HTML ze strony. Możesz ustawić strategię ładowania strony z chromeoptions
Zaktualizowane rozwiązanie -2: Zgadzam się z DebanjanB, strategia PageLoad z Brakiem, bez pobierania dodatkowych plików (obrazów, css, js itp.) Nie jest dobrym pomysłem podczas przeprowadzania testów. Przeszukałem wszystkie problemy i starałem się znaleźć prawidłowe rozwiązanie. Próbowałem poniżej opcji, ponieważ kiedyś udało mi się rozwiązać ten problem.
Żadne z nich nie pomogło Ale znalazłem jedno rozwiązanie ze strategią ładowania strony. Tym razem pobieramy wszystkie zasoby podrzędne, ale czekamy na zdarzenie DOMContentLoaded . Ta strategia nazywa się Eager . Mała definicja wszystkich 3 strategii ładowania stron
1. normal: Ta strategia powoduje, że Selenium czeka na pełne załadowanie strony (zawartość HTML i zasoby podrzędne pobrane i przeanalizowane).
2. chętny: Ta strategia powoduje, że Selenium czeka na zdarzenie DOMContentLoaded (treść HTML jest pobierana i analizowana tylko).
3. none: Ta strategia powoduje powrót Selenium natychmiast po pełnym otrzymaniu początkowej zawartości strony (pobrana treść HTML).
UWAGA: Domyślnie, gdy Selenium ładuje stronę, następuje normalna pageLoadStrategy.
Fragment kodu bez korzystania ze strategii ładowania strony (lub normalny domyślnie używany przez selen)
Dane wyjściowe konsoli:
Dzięki strategii PageLoad - chętni:
Fragment kodu:
Dane wyjściowe konsoli:
źródło