Przekroczono limit czasu odbierania wiadomości z renderera: 0.100 wiadomości dziennika przy użyciu ChromeDriver i Chrome v80 za pośrednictwem Selenium Java

38

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?

DebanjanB
źródło
7
Mam również ten sam problem :(
Sooraj,
6
Ten sam problem pojawia się po aktualizacji do wersji 80. Chociaż twoje pytanie prawdopodobnie powinno zawierać pytanie, jak to naprawić, zamiast pytać, czy ktoś ma ten sam problem.
Taplar
2
Nie mogę uwierzyć, że to pytanie zostało zamknięte. Wiele razy SO zawodzi jako silnik do pomocy.
Saeed Neamati
4
W obliczu dokładnie tego samego problemu. Cały nasz zautomatyzowany kod Selenium jest uszkodzony. Nie możemy obniżyć wersji z powodu dużej złożoności.
Saeed Neamati
2
@DebanjanB Tak, przejrzałem twój post. Mam nadzieję, że uda się to naprawić w następnej wersji. Próbowałem znaleźć rozwiązanie, więc wspomniałem o nim, ale jest więcej opcji, aby zapobiec przekroczeniu limitu czasu. Spróbuję z inną opcją, ale jeśli czas oczekiwania jest bardzo krótszy, myślę, że musimy poczekać na następne wydanie.
Muzzamil

Odpowiedzi:

24

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:

      System.setProperty("webdriver.chrome.driver", "C:\\Utility\\BrowserDrivers\\chromedriver.exe");
      WebDriver driver =  new ChromeDriver();
      driver.quit();
      
    • Dane wyjściowe konsoli:

      Starting ChromeDriver 80.0.3987.106 (f68069574609230cf9b635cd784cfb1bf81bb53a-refs/branch-heads/3987@{#882}) on port 20041
      Only local connections are allowed.
      Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code.
      Feb 14, 2020 9:50:57 PM org.openqa.selenium.remote.ProtocolHandshake createSession
      INFO: Detected dialect: W3C
      
  • Jeśli używasz Chrome v81 , użycie ostatnio wydanego ChromeDriver 81.0.4044.20 rozwiązuje problem.

  • Jeśli używasz Chrome z kanału deweloperskiego lub kanaryjskiego , musisz pobrać pliki binarne specyficzne dla platformy:

Trwałe rozwiązanie

Jednak @bugdroidprzesłano rzeczywistą poprawkę za pośrednictwem tej zmiany / zatwierdzenia, która jest następująca:

[ChromeDriver] pomija rejestrowanie limitu czasu ponownej próby : r1924789 dodał pętlę ponownej próby podczas oczekiwania na wiadomości DevTools. Spamował dzienniki użytkowników z nieinformacyjnymi raportami o przekroczeniu limitu czasu. Ten CL pomija te komunikaty dziennika i poprawnie zgłasza wartość limitu czasu polecenia, gdy jest to właściwe.

Uwaga :

  • Status: Naprawiono
  • Etykiety: ToBeReleased ChromeDriver-82

Historia

Ten komunikat o błędzie ...

[1581082020.245][SEVERE]: Timed out receiving message from renderer: 0.100

... 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::HandleEventsUntilaby umożliwić dodatkowe sprawdzanie stanu nawigacji. Niestety, gdy upłynął limit czasu, jest on rejestrowany jako SEVERE (wg ProcessNextMessage). W przypadku tego krótkiego limitu czasu nie powinien on rejestrować się jako SEVERE , chociaż limity czasu SendCommandInternalnadal 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 :

[WARNING]: This version of ChromeDriver has not been tested with Chrome version 80

co brzmi jak ... bezpieczne obejście ... i zostało potwierdzone przez członka zespołu Chromium .

chromedriver79

  • Blok kodu:

    public class A_Chrome 
    {
        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 79.0.3945.36 (3582db32b33893869b8c1339e8f4d9ed1816f143-refs/branch-heads/3945@{#614}) on port 9200
    Only local connections are allowed.
    Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code.
    [1581503845.444][WARNING]: This version of ChromeDriver has not been tested with Chrome version 80.
    Feb 12, 2020 4:07:26 PM org.openqa.selenium.remote.ProtocolHandshake createSession
    INFO: Detected dialect: W3C
    

tl; dr

Kilka istotnych dyskusji można znaleźć w:

DebanjanB
źródło
1
Należy również pamiętać, że ten komunikat dziennika wydaje się być zapisywany jako stderror. Miałem skrypt programu PowerShell, który zaczynał się nie powieść po uruchomieniu testów, vstest.console.exeponieważ $?zmienna PowerShell była $falsemimo, że testy przeszły pomyślnie. Wydaje się, że PowerShell uważa, że ​​cokolwiek napisane do stderror jest błędem, nawet jeśli $LastExitCodedla testera runner zwrócił zero.
Greg Burghardt
4
Odp: Chrome v80 przy użyciu niedawno wydanego ChromeDriver 80.0.3987.106 rozwiązuje problem. Odp: Chrome v81, używając niedawno wydanego ChromeDriver 81.0.4044.20 rozwiązuje problem. Nadal widzę problem z aktualizacjami ChromeDirver.
Neil
1
Tak !!!!! ChromeDriver v79 win32 działa dobrze z chrome v80.0.3987.132 i nie wyświetla błędu TimedOut w konsoli. Ale czasami Chromedriver nie uruchamia serwera.
Surodip
1
Korzystanie z obejścia chromedriver v79 nie działa już w najnowszej wersji stabilnego chrome (81.0.4044.92), a sterownik nie może nawet otworzyć chrome. Zaktualizowałem chromedriver do najnowszego i działa, ale powróciły poważne błędy przekroczenia limitu czasu.
PST
@PST - dokładnie te same problemy. To jest frustrujące.
Sriram Ilango
10

Główna przyczyna: Ilekroć ładujesz jakąś stronę za pomocą sterownika selenu, wtedy driverskrypt zaczekaj, aż strona zostanie całkowicie załadowana. Ale czasami webdriver potrzebuje więcej czasu na załadowanie strony, w takim przypadku zobaczysz TimeoutExceptionwyją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

ChromeOptions options = new ChromeOptions();
options.setPageLoadStrategy(PageLoadStrategy.NONE);

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.

    options.addArguments("start-maximized"); 
    options.addArguments("enable-automation"); 
    options.addArguments("--no-sandbox"); 
    options.addArguments("--disable-infobars"); 
    options.addArguments("--disable-dev-shm-usage"); 
    options.addArguments("--disable-browser-side-navigation"); 
    options.addArguments("--disable-gpu");

Ż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)

System.setProperty("webdriver.chrome.driver", "C:\\Users\\...\\LatestDriver\\chromedriver.exe");   
WebDriver driver=new ChromeDriver();
driver.get("http://www.google.com");
driver.manage().window().maximize();
WebDriverWait wait = new WebDriverWait(driver, 20);
WebElement el = wait.until(ExpectedConditions.elementToBeClickable(By.name("q")));
el.click();
List <WebElement> allLinks = driver.findElements(By.tagName("a"));
System.out.println(allLinks.size());
driver.quit();

Dane wyjściowe konsoli:

Uruchamianie ChromeDriver 80.0.3987.16 (320f6526c1632ad4f205ebce69b99a062ed78647-refs / branch-heads / 3987 @ {# 185}) na porcie 41540 Dozwolone są tylko połączenia lokalne. Chroń porty używane przez ChromeDriver i powiązane platformy testowe, aby zapobiec dostępowi złośliwego kodu. 11 lutego 2020 10:22:12 org.openqa.selenium.remote.ProtocolHandshake createSession INFO: Wykryty dialekt: W3C [1581412933.937] [SEVERE]: Przekroczono limit czasu odbierania wiadomości od renderera: 0.100 [1581412934.066] [SEVERE]: Przekroczono limit czasu odbieranie wiadomości z renderera: 0.100 [1581412934.168] [SEVERE]: Przekroczono limit czasu odbierania wiadomości z renderera: 0.100 [1581412934.360] [SEVERE]: Przekroczono limit czasu odbierania wiadomości z renderera: 0.100 [1581412934.461] [SEVERE]: Przekroczono limit czasu odbierania wiadomości z renderera: 0.100 [1581412934.618] [SEVERE]:

Dzięki strategii PageLoad - chętni:

Fragment kodu:

System.setProperty("webdriver.chrome.driver", "C:\\Users\\...\\LatestDriver\\chromedriver.exe");
ChromeOptions options = new ChromeOptions();
options.setPageLoadStrategy(PageLoadStrategy.EAGER);
WebDriver driver=new ChromeDriver(options);
driver.get("http://www.google.com");
driver.manage().window().maximize();
WebDriverWait wait = new WebDriverWait(driver, 20);
WebElement el = wait.until(ExpectedConditions.elementToBeClickable(By.name("q")));
el.click();
List <WebElement> allLinks = driver.findElements(By.tagName("a"));
System.out.println(allLinks.size());
driver.quit();

Dane wyjściowe konsoli:

Uruchamianie ChromeDriver 80.0.3987.16 (320f6526c1632ad4f205ebce69b99a062ed78647-refs / branch-heads / 3987 @ {# 185}) na porcie 1175 Dozwolone są tylko połączenia lokalne. Chroń porty używane przez ChromeDriver i powiązane platformy testowe, aby zapobiec dostępowi złośliwego kodu. 11 lutego 2020 10:29:05 AM org.openqa.selenium.remote.ProtocolHandhake createSFO IN Session: Wykryty dialekt: W3C
21

Muzzamil
źródło
Zasadniczo nie będziesz w stanie dostosować strategii PageLoad, ponieważ konfiguracje WebDriver są ustandaryzowane i najlepiej pasują do wymaganej strategii testowej. Jednak w dyskusjach Jak sprawić, by Selenium nie czekał do pełnego załadowania strony , Nie czekaj na załadowanie strony , omówiliśmy ją szczegółowo. Jest to problem z ChromeDriver v80.
DebanjanB
2
@DebanjanB Zgadzam się z tobą, ale jak wiesz SO jest społecznością, która ma zamiar rozwiązać problemy. Próbowałem najlepszego możliwego rozwiązania. Jeśli wiesz, że jest to PROBLEM lub BŁĄD w sterowniku chrome, musimy zarejestrować ten problem w projekcie Git lub w zalecanym miejscu. Podnoszenie pytań w SO nie pomoże.
Muzzamil
Niedawno zaktualizowałem mój chrome i chromedriver, a następnie zacząłem otrzymywać te wszystkie komunikaty ostrzegawcze. Teraz próbuję obniżyć wersję Chrome i nie mogę znaleźć skąd wziąć Chrome 79v. Czy ktoś może podać mi link do pobrania chrome 79v
Vin
@Vin tutaj możesz pobrać chromedriver.chromium.org/downloads
Muzzamil