web-dev-qa-db-fra.com

wait.until (ExpectedConditions) ne fonctionne plus dans le sélénium

Jusqu'ici, j'ai utilisé la version 2.45.0 de Selenium et toutes mes attentes ont été effectuées de la manière suivante:

WebDriverWait wait = new WebDriverWait(webKitUtility.getWebDriver(), 5);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("role")));

Mais j'ai mis à jour Selenium à 3.1.0 et je reçois l'erreur:

"La méthode jusqu'à ce que (Predicate) du type FluentWait ne soit pas applicable pour les arguments (ExpectedCondition)"

Je vois que de 2.45.0 à 3.1.0, certaines choses sont déconseillées. J'essaie de déterminer quelle est la meilleure façon de le faire maintenant, mais je ne suis pas sûr. La plupart des choses que je trouve sur Google sont de vieilles informations expliquant la même façon que j'utilisais jusqu'à présent.

24
lijep dam

Vous auriez besoin d'ajouter une dépendance:

<dependency>
        <groupId>org.seleniumhq.Selenium</groupId>
        <artifactId>Selenium-support</artifactId>
        <version>3.0.1</version>
</dependency>

C'est pour que votre code fonctionne toujours. Bien qu’en fin de compte, le code doive être réécrit pour ne pas utiliser FluentWait, un logiciel obsolète.

2
Lukasz

Si vous utilisez maven pour gérer vos dépendances, vérifiez la hiérarchie des dépendances et la version de goyave utilisée. Le fichier JAR du pilote distant Selenium requiert la version 21 de la goyave. Ajoutez une exclusion à l'artefact qui utilise la version indésirable de la goyave. Par exemple:

<dependency>
<groupId>io.github.bonigarcia</groupId>
<artifactId>webdrivermanager</artifactId>
<version>1.5.1</version>
  <exclusions>
    <exclusion>
       <groupId>com.google.guava</groupId>
       <artifactId>guava</artifactId>
    </exclusion>
  </exclusions>
</dependency>
1
Ricardo

J'ai eu cette erreur de compilation lorsque je suis passé de Selenium 2 (org.seleniumhq.Selenium: sélénium-Java: 2.53.0) à Selenium 3 (org.seleniumhq.Selenium: sélénium-Java: 3.4.0).

Comme mentionné ci-dessus, je devais passer de goyave 18 (goyave: com.google.guava: 18.0) à goyave 21 (goyave: com.google.guava: 21.0).

Cependant, je devais également configurer la construction pour utiliser Java 8 car 

ExpectedCondition<T> extends Function<WebDriver, T>
Function<F, T> extends Java.util.function.Function<F, T>

où Java.util.function.Function doit provenir de Java 8 JDK.

Pour la ligne de commande, j'ai remplacé ma variable d'environnement Java_HOME par Java_HOME: C:\Program Files\Java\jdk1.8.0_131.

Pour Eclipse, Windows -> Préférences, Java/JRE installés, Bouton Ajouter, Accueil JRE: C:\Program Files\Java\jdk1.8.0_131 et nom de JRE: jdk1.8.0_131.

1
Scott Izu

Notez si vous utilisez Maven que l'ordre des dépendances est important

Par exemple: 

public static void main(String[] args) {
    System.setProperty("webdriver.gecko.driver", "/Users/me/geckodriver");
    final WebDriver driver = new FirefoxDriver();
    driver.get("https://www.google.com");
    final WebDriverWait wait = new WebDriverWait(driver, 5);
    final By feelLuckyXpath = By.xpath("//div[@class='jsb']/center/input[@type='submit' and @name='btnI']");
    wait.until(ExpectedConditions.visibilityOfElementLocated(feelLuckyXpath)).click();
    driver.close();
}

ce code fonctionne bien avec les dépendances maven suivantes:

<dependency>
    <groupId>org.seleniumhq.Selenium</groupId>
    <artifactId>Selenium-Java</artifactId>
    <version>3.8.1</version>
</dependency>

<dependency>
    <groupId>com.google.api-client</groupId>
    <artifactId>google-api-client</artifactId>
    <version>1.22.0</version>
</dependency>

mais il peut échouer avec un réordonné:

<dependency>
    <groupId>com.google.api-client</groupId>
    <artifactId>google-api-client</artifactId>
    <version>1.22.0</version>
</dependency>

<dependency>
    <groupId>org.seleniumhq.Selenium</groupId>
    <artifactId>Selenium-Java</artifactId>
    <version>3.8.1</version>
</dependency>

Dans ce cas car le google-api-client contient:

<groupId>com.google.guava</groupId>
<artifactId>guava-jdk5</artifactId>

comme dépendance qui masque la guava lib dans la Selenium lib.

Dans ce cas, l'erreur est la suivante:

aucune instance de type variable (s) V n'existe de sorte que ExpectedCondition <> ...

méthode jusqu’en classe org.openqa.Selenium.support.ui.FluentWait ne peut pas être appliqué à des types donnés; requis: Java.util.function.Function trouvé: org.openqa.Selenium.support.ui.ExpectedCondition raison: impossible d'inférer la ou les variables de type V (Argument mismatch; org.openqa.Selenium.support.ui.ExpectedCondition ne peut pas être converti en Java.util.function.Function.)

1
nyxz

Vous pouvez faire quelque chose comme ceci pour la nouvelle FluentWait

    new WebDriverWait(driver, 60).until(new Function<WebDriver, Boolean>() {
    Boolean isWindowFound = Boolean.FALSE;
        @Override
        public Boolean apply(WebDriver driver) {
            try {
                driver.switchTo().window("Your Window Name");
                isWindowFound = Boolean.TRUE;
            } catch (NoSuchWindowException e) {
                System.out.println("Your Window Name not found");
                System.out.println(driver.getTitle());
                return isWindowFound;
            }
            return isWindowFound;
        }
    });
1
Damien-Amen

j'ai supprimé cette erreur en ajoutant Guava 21 et en supprimant Guava 20.0 lorsque vous utilisez Selenium à partir de la version 3.1.0

0
CodingGirl1

Je rencontrais le même type de problème lié à Java.util.function après avoir apporté les modifications ci-dessus à la version 21 de la goyave en remplaçant la version de configuration du plug-in maven par Maven-compiler-plugin 3.11.81.8
J'étais toujours coincé avec la même erreur et la construction échouait. La solution à cela consiste à supprimer le dossier maven repo .m2, à importer le projet à partir du début, puis à essayer d'apporter les modifications suivantes. Essayez d'effectuer une mise à jour Maven après avoir modifié la version du serveur POM Selenium Java et Selenium, puis essayez de créer un maven. clean suivi de maven install.Comment le pom.xml utilisait-il encore l'ancienne version de Selenium dans mon cas. J'ai changé la version utilisée de jdk en 1.8 après avoir apporté les modifications du plug-in maven et maintenant cela fonctionne parfaitement pour moi 

0
nikita

cette dépendance fonctionne pour moi.

<dependency>
        <groupId>org.seleniumhq.Selenium</groupId>
        <artifactId>Selenium-support</artifactId>
        <version>3.0.1</version>
</dependency>
0
Sarthak Chadha