[Google-Chrome] Débogage "L'élément n'est pas cliquable au point" erreur



Answers

Vous pouvez également utiliser JavaScript et le défilement ne serait pas nécessaire alors.

IJavaScriptExecutor ex = (IJavaScriptExecutor)Driver;
ex.ExecuteScript("arguments[0].click();", elementToClick);
Question

Je vois cela uniquement dans Chrome.

Le message d'erreur complet lit:

"org.openqa.selenium.WebDriverException: L'élément n'est pas cliquable au point (411, 675).) Un autre élément recevra le clic: ..."

L'élément qui «recevrait le clic» est sur le côté de l'élément en question, pas au-dessus de celui-ci et ne le chevauche pas, ne se déplaçant pas autour de la page.

J'ai essayé d'ajouter un décalage, mais cela ne fonctionne pas non plus. L'élément est sur la fenêtre affichée sans aucun besoin de défilement.




J'ai eu le même problème et j'ai obtenu l'erreur 'l'autre élément recevrait le clic' pour un élément affiché et visible. Je n'ai trouvé aucune autre solution pour déclencher le clic avec un javascript.

J'ai remplacé:

WebElement el = webDriver.findElement(By.id("undo-alert"));
WebElement closeButton = el.findElement(By.className("close"));
// The following throws 'Element is not clickable at point ... Other element 
// would receive the click'
closeButton.click();

avec:

((JavascriptExecutor) webDriver).executeScript(
    "$('#undo-alert').find('.close').click();"
);

et tout a bien fonctionné




Explication du message d'erreur :

Le message d'erreur indique simplement que l'élément sur lequel vous voulez cliquer est présent, mais il n'est pas visible. Il pourrait être couvert par quelque chose ou temporaire non visible.

Il peut y avoir plusieurs raisons pour lesquelles l'élément n'est pas visible au moment du test. S'il vous plaît ré-analyser votre page et trouver la bonne solution pour votre cas.

Solution pour cas particulier :

Dans mon cas, cette erreur survient, quand une info-bulle de l'élément d'écran sur lequel je viens de cliquer, apparaissait sur l'élément que je voulais cliquer ensuite. Le défocalisation était une solution dont j'avais besoin.

  • Une solution rapide pour la défocalisation serait de cliquer sur un autre élément dans une autre partie de l'écran qui ne fait "rien" resp. Rien ne se passe après une action de clic.
  • La solution appropriée serait d'appeler element.blur() sur l'élément en faisant apparaître l'info-bulle, ce qui ferait disparaître l'info-bulle.



Avait eu cette erreur lors de l'exécution de tests headless avec xvfb-run. Ils travaillaient parfaitement sur place. En utilisant le chrome, les versions de webdriver / chromedriver / chrome / java etc sont identiques.

Le bug 'ne corrigera pas' dans le chromedriver - http://code.google.com/p/selenium/issues/detail?id=2766 souligné par Tony Lâmpada a suggéré que cela pourrait être lié à ce qui est / n'est pas visible sur l'écran.

Le message d'aide pour xvfb-run affiche les éléments suivants:

-s ARGS   --server-args=ARGS    arguments (other than server number and
                                "-nolisten tcp") to pass to the Xvfb server
                                (default: "-screen 0 640x480x8")

Changer la résolution pour xvfb fait disparaître l'erreur:

xvfb-run -s "-screen 0 1280x1024x16" ...



C'est drôle, tout le temps que j'ai passé à regarder les différentes réponses, personne n'avait essayé l'évidence, ce qui bien sûr, je ne l'avais pas non plus. Si votre page a le même identifiant utilisé plusieurs fois, comme le mien, ("newButton",) et celui que vous voulez n'est pas le premier trouvé, alors vous aurez très probablement cette erreur. La chose la plus facile à faire (C #):

var testIt = driver.FindElements(By.Id("newButton"));

Notez que c'est FindElements, pas FindElement.

Et puis testez pour voir combien de résultats sont revenus de la récupération. Si c'est le second, vous pouvez alors utiliser:

testit[1].Click();

Ou obtenez n'importe quel identifiant réutilisé pour les réparer.




J'étais confronté au même problème avec clj-webdriver (port clojure de Selenium). Je viens de traduire la solution précédente pour clojure par commodité. Vous pouvez appeler cette fonction avant d'effectuer un clic ou autre pour éviter ce problème.

(defn scrollTo
  "Scrolls to the position of the given css selector if found"
  [q]
  (if (exists? q) 
    (let [ loc (location-once-visible q) jscript (str "window.scrollTo(" (:x loc) "," (:y loc) ")") ] 
      (execute-script jscript))))



J'ai eu un autre bug où find_link sur Chrome et Poltergeist ne pouvaient pas cliquer sur une balise A avec une balise EM et du texte à l'intérieur, même si cela fonctionnait bien dans Firefox et rack_test. La solution consistait à remplacer click_link(link) par:

find('a em', text: link).click



J'ai eu le même problème et il a été provoqué par un conflit d'identité entre le div et le lien à l'intérieur du div. Donc le conducteur cliquait sur la div au lieu du lien que je voulais. J'ai changé le div id et cela a fonctionné correctement.

Avant:

<div id="logout"><a id="logout" href="logoutLink">logout</a></div>

Après:

<div id="differentId"><a id="logout" href="logoutLink">logout</a></div>



J'ai eu le même problème, j'ai essayé toutes les solutions proposées mais elles n'ont pas fonctionné pour moi. finalement j'ai utilisé ceci:

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("var evt = document.createEvent('MouseEvents');" + "evt.initMouseEvent('click',true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0,null);" + "arguments[0].dispatchEvent(evt);", findElement(element));

J'espère que cela t'aides




J'ai rencontré ce problème et cela semble provoqué (dans mon cas) en cliquant sur un élément qui affiche une div devant l'élément cliqué. J'ai contourné ceci en enveloppant mon clic dans un grand bloc de prise d'essai.




Peut-être que ce n'est pas une solution vraiment propre mais ça marche:

try:
    el.click()
except WebDriverException as e:
    if 'Element is not clickable at point' in e.msg:
        self.browser.execute_script(
            '$("{sel}").click()'.format(sel=el_selector)
        )
    else:
        raise



Après avoir testé toutes les suggestions mentionnées, rien n'a fonctionné. J'ai fait ce code. Ça marche, mais ce n'est pas beau

public void click(WebElement element) {
    //https://code.google.com/p/selenium/issues/detail?id=2766 (fix)
    while(true){
        try{
            element.click();
            break;
        }catch (Throwable e){
            try {
                Thread.sleep(200);
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
        }
    }
}

public void click(String css) {
    //https://code.google.com/p/selenium/issues/detail?id=2766 (fix)
    while(true){
        try{
            driver.findElement(By.cssSelector(css)).click();
            break;
        }catch (Throwable e){
            try {
                Thread.sleep(200);
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
        }
    }
}



Tout d'abord, essayez d'obtenir le dernier pilote Chrome et vérifiez s'il résout le problème.

Dans mon cas, cela n'a pas réglé le problème. Mais, la solution suivante a fonctionné pour moi jusqu'à présent. Ce qui suit est un code C # mais vous pouvez suivre la même logique dans votre langue spécifique. Ce que nous faisons ici est,

Étape 1: Focus sur l'élément en utilisant l'objet Selenium Actions,

Étape 2: Faites ensuite un clic sur l'élément

Étape 3: S'il y a une exception, nous déclenchons un événement javascript "Click" sur l'élément en exécutant le script javascript via la méthode "ExecuteScript" du pilote du navigateur Selenium.

Vous pouvez également ignorer les étapes 1 et 2 et essayer uniquement l'étape 3. L'étape 3 fonctionnerait par elle-même mais j'ai remarqué un comportement étrange dans un scénario dans lequel l'étape 3, même si elle cliquait avec succès sur l'élément, provoquait un comportement inattendu dans d'autres parties de mon code après avoir cliqué sur l'élément.

            try
            {
                //Setup the driver and navigate to the web page...
                var driver = new ChromeDriver("folder path to the Chrome driver");
                driver.Navigate().GoToUrl("UrlToThePage");

                //Find the element...
                var element = driver.FindElement(By.Id("elementHtmlId")); 

                //Step 1
                new Actions(driver).MoveToElement(element).Perform();  

                //Step 2
                element.Click();
            }
            catch (Exception)
            {
                //Step 3
                driver.ExecuteScript("document.getElementById('elementHtmlId').click();");

            }



Moi aussi, j'ai lutté avec ce problème. Le code fonctionne bien dans FF, échoue sur Chrome. Ce que j'essayais de faire était de cliquer sur une case à cocher - si elle n'était pas visible, je devais la faire défiler pour la voir, puis cliquer sur. Même si le défilement dans la vue fonctionne dans Chrome, seuls les quelques pixels du bas de la case ne sont pas visibles, de sorte que webdriver refuse de cliquer dessus.

Ma solution de contournement est la suivante:

WebElement element = _sectorPopup.findElement(...);

((Locatable) element).getCoordinates().inViewPort();
try {
    element.click();
} catch (Exception e) {
    new Actions(getWebDriver()).sendKeys(Keys.PAGE_DOWN).perform();
    element.click();
}

Chrome a également des problèmes avec sendKeys, l'utilisation d'Actions est parfois nécessaire. Évidemment, vous devez savoir dans quelle direction et combien vous devez aller afin que votre kilométrage puisse varier. Mais je préfère ceci au hack javascript, donc je l'affiche ici au cas où quelqu'un d'autre le trouverait utile.




En utilisant Protractor, cela m'a aidé:

var elm = element(by.css('.your-css-class'));
browser.executeScript("arguments[0].scrollIntoView();", elm.getWebElement());
elm.click();