Expiration du délai de connexion à Chrome, nouvelle tentative… erreur avec ChromeDriver 2.43 et Chrome via Selenium

Aug 16 2020

Honnêtement, je ne sais même pas quoi faire à ce stade. Je ne reçois aucun journal d'erreurs dans la console, uniquement les messages de journalisation que j'ai mis dans les scripts.

Lorsque j'arrive à la ligne de code où je crée le constructeur de tableau de bord, il met fin au test et le déclare un échec, le dernier message enregistré est toujours "À propos de commencer à chercher"

J'ai même vidé tout le constructeur (commenté tout le code, supprimé le paramètre du pilote et y mettre simplement une instruction d'impression) avant de publier cette question et lorsque j'ai appelé la méthode d'impression dans la classe, le script a échoué à la ligne où la création de le constructeur est arrivé.

Je ne comprends pas ce qui se passe, je pourrais manquer quelque chose de très évident. J'obtiens un échec mais je ne vois pas nécessairement de message d'erreur spécifique dans la console non plus.

Voici le cas de test que je tente d'exécuter:

package com.symphio.testCases;
import java.util.concurrent.TimeUnit;
import org.testng.Assert;
import org.testng.annotations.Test;
import com.symphio.pageObjects.Dashboard;
import com.symphio.pageObjects.loginSymphio;


public class TC_Dashboard_Search_002 extends BaseClass{

    
    @Test
    public void searchForTile() throws InterruptedException {
        
        logger.info("Connected to "+ baseURL);
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
                
        loginSymphio login = new loginSymphio(driver);
        //logs in
        login.setUserName(userName);
        logger.info("entered username");
        login.setPassWord(passWord);
        logger.info("entered password");
        login.pressSubmit();
        logger.info("button pressed");
        
        
        //searches for tile
        Thread.sleep(3000);


        logger.info("about to start looking");
        Dashboard dashboard = new Dashboard(driver);
        dashboard.mouseMover();
        logger.info("found Icon");
        dashboard.searchBarText(searchText);
        logger.info("input text");
        dashboard.tileClick();      
        logger.info("clicked");
                
    }
}

Voici ma page DashBoard

package com.symphio.pageObjects;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;

public class Dashboard {
    WebDriver driver;

    public Dashboard(WebDriver driver) {
        this.driver = driver;
        PageFactory.initElements(driver, this);     
        
    } 
        
    @FindBy(className="search-container")
    WebElement searchImg;
    
    @FindBy(xpath="//input[@type='search']")
    WebElement searchText;
    
    @FindBy(xpath="//input[contains(@class,'mat-card'), and contains(@class, 'mat-focus-indicator'), and contains(@class, 'arrangement-card')]")
    WebElement tileBox;
    
    
    Actions actions = new Actions(driver);

    public void mouseMover() {
    Actions mouseOverOnElement = actions.moveToElement(searchImg);
    mouseOverOnElement.perform();
    
    }
    
    public void searchBarText(String text) {
        searchText.sendKeys(text);
                
    }
    
    public void tileClick() {
        tileBox.click();
        
        
    }
    
}

Erreur de console:

Réponses

DebanjanB Aug 16 2020 at 22:27

Ce message d'erreur ...

...[WARNING]: Timed out connecting to Chrome, retrying...
...org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: OSS

... cela implique que le combo ChromeDriver / google-chrome que vous utilisez n'est pas le plus récent car la mise en œuvre actuelle de ChromeDriver suit les spécifications WebDriver W3C et les journaux initiaux reflètent:

Only local connections are allowed.
Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code.
Nov 05, 2019 3:41:53 PM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: W3C 

Votre principal problème est donc l' incompatibilité entre la version des binaires que vous utilisez comme suit:

  • Vous utilisez chromedriver = 2,43
  • Les notes de version de chromedriver = 2.43 mentionnent clairement ce qui suit:

Prend en charge Chrome v69-71

  • Vous utilisez peut-être le dernier chrome = 84.0
  • Les notes de publication de ChromeDriver v84.0 mentionnent clairement ce qui suit:

Prend en charge la version 84 de Chrome

Il y a donc une discordance claire entre ChromeDriver v2.43 et le navigateur Chrome v84.0


Solution

Veiller à ce que:

  • JDK est mis à jour aux niveaux actuels JDK 8u251 .
  • Selenium est mis à niveau vers les niveaux actuels de la version 3.141.59 .
  • ChromeDriver est mis à jour au niveau actuel de ChromeDriver v84.0 .
  • Chrome est mis à jour au niveau actuel de la version 84.0 de Chrome . (selon les notes de version de ChromeDriver v84.0 )
  • Si votre version de base du client Web est trop ancienne, désinstallez-la et installez une version GA récente et une version publiée de Web Client .
  • Nettoyez votre espace de travail de projet via votre IDE et reconstruisez votre projet avec les dépendances requises uniquement.
  • Faites un redémarrage du système .
  • Exécutez votre en @Testtant qu'utilisateur non root .
  • Appelez toujours driver.quit()au sein de la tearDown(){}méthode pour fermer et détruire les instances WebDriver et Web Client en douceur.

Référence

Vous pouvez trouver quelques discussions détaillées pertinentes dans:

  • Tentative de session bi-dialecte, en supposant que la loi de Postel reste vraie sur l'extrémité distante et en revenant au JSON OSS original à l'aide de ChromeDriver et Selenium
abracants Aug 16 2020 at 09:19

Je pense que le problème ici est que le pilote n'est pas encore initialisé dans la classe DashBoard.

essayez d'étendre le tableau de bord dans BaseClass.

public class Dashboard extends BaseClass {
    
    public Dashboard(WebDriver driver) {
        this.driver = driver;
        PageFactory.initElements(driver, this);  

}