2
votes

Ne pas intercepter NoSuchElementException

Je récupère les montages d'un site Web, puis j'utilise un autre site Web pour vérifier la forme de chaque équipe. Le problème que je rencontre est que toutes les équipes n'existent pas sur le site Web du formulaire et que je reçois une NoSuchElementException pour les équipes dont la compensation xPath n'existe pas sur l'URL introuvable page. J'essaie d'attraper l'exception mais le programme est toujours en panne.

J'ai ajouté un try catch mais cela ne résout pas mon problème, le programme s'arrête dès qu'il arrive en tant qu'équipe non trouvée.

 for(int i = 0; i < fixtures.getAwayTeams().size(); i++)
 {
     driver.navigate().to(FORMURL.concat( (fixtures.getAwayTeams().get(i)).replace( ' ', '+' )));          
     for (int j = 1; j < 11; j++) {
        String xPath = FORMXPATHONE.concat( String.valueOf( j ) ).concat(FORMXPATHTWO);
        try {
            wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(xPath)));
            forms = driver.findElementsByXPath( xPath );
            } catch(NoSuchElementException | StaleElementReferenceException e) {
            awayTeamForm.add("No Form for Team");
            }
        for (WebElement languageElement : forms) {
            ArrayList <String> wld = new ArrayList<String>();
            wld.add( languageElement.getText() );
            String listedForm = String.join(",", wld );
            awayTeamForm.add(listedForm);
        }
    }
    }
 }  

Provoqué par: org.openqa.selenium.NoSuchElementException: Impossible de localiser l'élément: // * [@ id = "results"] / table / tbody / tr [1] / td [6]


1 commentaires

Vous avez probablement détecté la mauvaise NoSuchElementException . Il y a la java.util.NoSuchElementException par défaut que vous attrapez probablement, tandis que le code lance une org.openqa.selenium.NoSuchElementException


4 Réponses :


0
votes

Votre instruction try-catch semble correcte. Ce qui signifie que le problème doit être ailleurs.

Vous utilisez du sélénium, ce qui signifie qu'il existe deux exceptions appelées NoSuchElementException disponibles. Vérifiez vos importations. Le problème que vous rencontrez probablement est que vous importez java.util.NoSuchElementException au lieu de org.openqa.selenium.NoSuchElementException


3 commentaires

J'ai vérifié et j'ai importé org.openqa.selenium.NoSuchElementException; et non java.util.NoSuchElementException


C'est étrange. Souhaitez-vous publier le StackTrace complet? Peut-être qu'il y a quelque chose là-dedans qui donne un meilleur indice.


J'ai peut-être mal regardé cela. Il semble que j'obtiens une TimeoutException causée par NoSuchElementException, peut-être ai-je besoin d'attraper une TimeoutException? Exception dans le thread "main" org.openqa.selenium.TimeoutException: La condition attendue a échoué: attente de la visibilité de l'élément localisé par By.xpath: // * Causée par: org.openqa.selenium.NoSuchElementException: Impossible de localiser l'élément: // * [@ id = "résultats"] / table / tbody / tr [1] / td [6]



0
votes

Vous pouvez vérifier que l'élément est présent sur la page ou non en récupérant d'abord la liste d'éléments puis en vérifiant la taille de cette liste, si elle est supérieure à 0 alors l'élément est présent sinon l'élément n'est pas présent sur la page . Par cela, vous n'avez pas besoin d'attraper l'exception également.

Vous pouvez le faire comme:

List<WebElement> elementList = driver.findElements(By.xpath("xPath"));
if(elementList.size()>0){
    // Element is present
}
else{
    // Element is not present
}


3 commentaires

Pendant que je fais ce premier wait.until (ExpectedConditions.visibilityOfElementLocated (By.‌ xpath (xPath))); N'obtiendrai-je pas l'exception quand il ne peut pas voir l'élément?


Non, cela ne fonctionne pas (ce à quoi vous êtes également confronté) car lorsque l'élément n'est pas présent sur la page, il lève une exception de pointeur nul. Cela ne fonctionne que lorsque l'élément est présent sur la page mais n'est pas visible. Dans votre cas, l'élément n'est pas là sur la page, vous devez donc suivre l'approche que j'ai mentionnée dans la réponse.


Bien que je ne sache pas pourquoi il manque les exceptions, cette solution fonctionne. Merci.



0
votes

Essayez de capturer tout le corps de la boucle et de déboguer pour voir si vous attrapez la bonne exception et sur la bonne ligne. Êtes-vous sûr que seul

forms = driver.findElementsByXPath( xPath );

peut lever l'exception?


0 commentaires

0
votes

essayez ceci:

try {
        wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(xPath)));
        forms = driver.findElementsByXPath( xPath );
        } catch(NoSuchElementException | StaleElementReferenceException | TimeoutException e) {
            awayTeamForm.add("No Form for Team");
    }


1 commentaires

Exception dans le thread "main" org.openqa.selenium.StaleElementReferenceException: la référence d'élément de est périmée; soit l'élément n'est plus attaché au DOM, il n'est pas dans le contexte du cadre actuel ou le document a été actualisé. Pour obtenir de la documentation sur cette erreur, veuillez visiter: seleniumhq.org/exceptions/stale_element_reference.html