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!
3 Réponses :
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();
J'obtiens cette erreur: ElementNotInteractableException: L'élément n'a pas pu être affiché
@yoopaa salut, cette erreur a à voir avec quelque chose dans votre code que vous n'avez pas partagé si vous le pouvez, nous pourrons peut-être vous aider!
@yoopaa pouvez-vous partager l'URL?
Malheureusement non, c'est un site Web interne de l'entreprise. Je l'ai maintenant essayé avec l'exécuteur javascript et j'obtiens "élément non cliquable car un autre élément (iframe id =" innerIframe ") le masque. Cependant, si je passe à ce cadre, J'obtiens une autre erreur indiquant qu'un cadre comme celui-là n'existe pas. Savez-vous pourquoi?
Je pense que cela a à voir avec switchTo (). Frame . mais pouvez-vous obtenir le rect de cet élément: xpath ("// a [@ class = 'ui-dialog-titlebar-icon ui-dialog-titlebar-close ui-corner-all 'et @ aria-label =' Fermer '] ") ?
Il sera difficile de localiser l'élément via la balise car il s'agit d'un élément pseudo . Pour localiser l'élément, vous pouvez utiliser l'une des Stratégies de localisation a >:
cssSelector : 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']"))).click();
xpath : new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("a.ui-dialog-titlebar-icon.ui-dialog-titlebar-close.ui-corner-all[aria-label='Close']"))).click();
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
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);
Partagez vos sélecteurs