1
votes

Comment trouver un élément soit par "une classe" soit par "span class"?

J'essaye de cliquer sur un élément mais j'obtiens toujours l'erreur "impossible de localiser un élément en utilisant ..". Je l'ai essayé avec find by class, par csselector et par XPath. J'ai également essayé la classe a d'abord, puis l'élément de classe span, mais cela ne fonctionne toujours pas. C'est certainement le bon cadre aussi. C'est vraiment bizarre parce que ça a fonctionné il y a deux semaines, je n'ai rien changé au code et maintenant ça ne marche plus. Est-il possible que l'élément change constamment? Si tel est le cas, comment puis-je m'assurer qu'il trouve toujours l'élément sans ajuster mon code à chaque fois?

WebElement closePrint = (new WebDriverWait(driver, 10)).until(
            ExpectedConditions.presenceOfElementLocated(By.xpath("//div[@id='FileTab:Form:j_id674351400_da78919']/div/a/span")));
    JavascriptExecutor js1 = (JavascriptExecutor)driver;
    js1.executeScript("arguments[0].click();", closePrint);

Voici mon code actuel qui ne fonctionne toujours pas:

driver.findElement(By.xpath("//a[@class='ui-dialog-titlebar-icon ui-dialog-titlebar-close ui-corner-all' and @aria-label='Close']")).click();

Après avoir essayé la suggestion de DebanjanB en recherchant l'élément:

XXX

J'obtiens cette erreur: org.openqa.selenium.ElementNotInteractableException: L'élément ne pouvait pas être défilé dans la vue

Mise à jour : je l'ai corrigé par obtenir l'extension Selenium IDE pour Firefox, puis choisir le xpath qui a été généré par l'extension avec l'exécuteur javascript:

driver.switchTo().defaultContent();
    driver.switchTo().frame("frame_vehicleFileTab");
    try {
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    WebElement closePrint = (new WebDriverWait(driver, 10)).until(
            ExpectedConditions.elementToBeClickable(By.xpath("//*[@aria-label='Close']")));
    closePrint.click();

Je ne sais pas pourquoi ce xpath fonctionne maintenant mais Je suis content que ce soit le cas. Merci à tous pour vos suggestions!


1 commentaires

Partagez vos sélecteurs


3 Réponses :


0
votes

D'après ce que je peux voir dans le HTML, vous avez fourni:

Vous pouvez utiliser By.XPATH avec ce XPATH: "// * [@ aria-label = ' Fermer '] ".

Comme ceci:

WebElement closePrint = new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//a[@class='ui-dialog-titlebar-icon ui-dialog-titlebar-close ui-corner-all' and @aria-label='Close']")));

int width = closePrint.getSize().getWidth();

Actions clicker= new Actions(driver);
act.moveToElement(closePrint).moveByOffset((width/2)-2, 0).click().perform();

MODIFIER:

Essayez d'utiliser des Actions avec un décalage, cela aide s'il y a un élément qui le couvre, cela se produit avec les iFrames.

Voici un extrait de code:

d.findElement(By.xpath("//*[@aria-label='Close']")).click();



1
votes

3 commentaires

Malheureusement, les deux ne fonctionnent pas ... J'obtiens une TimeoutException: La condition attendue a échoué: en attente de l'élément cliquable


@yoopaa TimeoutException est le résultat d'un échec Conditions attendues . Déboguez votre code via findElement () en conjonction avec Thread.sleep () . Si vous parvenez à localiser l'élément, mettez à jour la question avec les observations.


Je ne parviens toujours pas à localiser l'élément, a mis à jour la question



0
votes

En plus de la suggestion de DebanjanB, je vous suggère également d'utiliser l'utilitaire JavaScript ci-dessous pour faire défiler jusqu'à ce que l'élément soit visible.

WebElement element = driver.findElement(By.xpath("//a[@class='ui-dialog-titlebar-icon ui-dialog-titlebar-close ui-corner-all' and @aria-label='Close']"));
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element);


0 commentaires