web-dev-qa-db-fra.com

Sélénium "Erreur dans l'élément lorsque vous ne pouvez pas cliquer sur un élément" dans Firefox

En ce qui concerne l'erreur Webdriver

Element is not clickable at point (X, Y). Another element would recieve the click instead.

Pour ChromeDriver, ceci est adressé à Débogage: "l’élément n’est pas cliquable au point" erreur , mais le problème peut également se produire dans Firefox.

Quels sont les meilleurs moyens de résoudre ce problème dans FirefoxDriver?

7
emery

Cela se produit dans les cas ci-dessous

  • Lorsque l'élément est chargé dans le DOM, mais que la position n'est pas Fixée sur l'interface utilisateur. Il peut y avoir une autre div ou des images qui ne sont pas Chargées complètement.

  • La page est en cours de rafraîchissement avant de cliquer sur l'élément.

Workaround

  • Utilisez Thread.sleep avant les actions sur chaque élément Web de l'interface utilisateur, mais ce n'est Pas une bonne idée.
  • Utilisez WebDriverWait ExpectedConditions.

Je faisais face au même problème, le temps de chargement de la page était plus long et une icône de chargement chevauchait toute la page Web.

Pour résoudre ce problème, j'ai implémenté WebDriverWait ExpectedConditions, qui attend que l'icône de chargement disparaisse avant d'effectuer l'action de clic sur un élément.

Appelez cette fonction avant d'effectuer une action (j'utilise un framework piloté par les données)

public void waitForLoader () throws Exception  {
  try {
   String ObjectArray[]=ObjectReader.getObjectArray("LoadingIcon"); 
    if(checkElementDisplayed(ObjectArray[3],ObjectArray[2]))
    {
     WebDriverWait wait = new WebDriverWait(remotewebdriver,10); 
     wait.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath(ObjectArray[3])));
    }
   } catch (NoSuchElementException e) {
   System.out.println("The page is loaded successfully");
   }
  }
4
Joe

Le même problème est résolu par Javascript. Merci d'essayer le code suivant au lieu de Selenium click

WebElement rateElement = driver.findElement(By.xpath(xpathContenRatingTab));
((JavascriptExecutor)driver).executeScript("arguments[0].click();", rateElement);
3
Sumit2500

Si votre problème est que l'élément est défilé à l'écran (et par conséquent sous quelque chose comme une barre d'en-tête), vous pouvez essayer de le faire défiler comme ceci:

private void scrollToElementAndClick(WebElement element) { 
int yScrollPosition = element.getLocation().getY(); 
js.executeScript("window.scroll(0, " + yScrollPosition + ");"); 
element.click(); }

si vous en avez besoin, vous pouvez également ajouter un décalage statique (si, par exemple, vous avez un en-tête de page de 200 pixels de haut et toujours affiché):

public static final int HEADER_OFFSET = 200; 
private void scrollToElementAndClick(WebElement element) { 
int yScrollPosition = element.getLocation().getY() - HEADER-OFFSET; 
js.executeScript("window.scroll(0, " + yScrollPosition + ");"); 
element.click(); 
}

Vous pouvez cliquer directement avec JavascriptExecutor (non recommandé)

WebElement element= driver.findElement(By."Your Locator"));

JavascriptExecutor executor = (JavascriptExecutor) driver;
executor.executeScript("arguments[0].click();", element);

J'espère que ça vous aidera :)

3
Shubham Jain

J'ai eu le même problème et je l'ai résolu en utilisant certaines capacités. Lorsque vous utilisez FirefoxDriver, vous pouvez définir "overlappingCheckDisabled" sur true pour résoudre votre problème. 

capabilities.setCapability("overlappingCheckDisabled", true);
2
Lorenzo Fidalgo

Une correspondance judicieuse de la version de jar Selenium avec la version de Firefox peut résoudre le problème. Selenium devrait automatiquement faire défiler un élément dans la vue s’il ne se trouve pas sur la page. Forcer un élément avec JavaScript est inutile.

Nous ne voyons jamais ce problème dansFirefox 31.5.0 avec Selenium-server-standalone-2.44.0.jar, toutefois lors de la mise à niveau vers Firefox 38.7.0 avec Selenium-server-standalone- 2.52.0.jar, c'est devenu un problème.

Voir https://github.com/seleniumhq/Selenium/issues/1543

2
emery

ActionBuilder peut résoudre l'erreur. Parfois, il y a un autre élément devant l'objet sur lequel il faut cliquer. Par conséquent, un clic sur ActionBuilder à l'emplacement de l'élément peut fonctionner dans les cas où un clic traditionnel échoue.

    Actions actions = new Actions(driver);
    actions.moveToElement(clickElement).click().perform();

ou essayez le milieu de l'élément

    Actions actions = new Actions(driver);
    Integer iBottom = clickElement.getSize().height;
    Integer iRight = clickElement.getSize().width;
    actions.moveToElement(clickElement, iRight/2, iBottom/2).click().perform();
1
Chuck Brown

Essayez de maximiser le navigateur lorsque vous travaillez avec des résolutions supérieures à 1024x768. Cela fonctionne pour moi en js.

 driver.manage().window().maximize();
0
D.JCode