Erreur de débogage «L'élément n'est pas cliquable au point»

397

Je ne vois cela que dans Chrome.

Le message d'erreur complet se lit comme suit:

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

L'élément qui «recevrait le clic» se trouve sur le côté de l'élément en question, pas au-dessus de celui-ci et ne le chevauchant pas, ne se déplaçant pas sur 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 besoin de faire défiler.

user1591169
la source
2
Attendez-vous que la page se charge? Peut-être qu'un autre élément le chevauche pendant le chargement de la page?
Herokiller
55
Longue histoire pour ceux qui viennent d'arriver - L'ÉLÉMENT N'EST PAS VISIBLE SUR LA PAGE ET DONC PAS CLICABLE. VOUS DEVEZ FAIRE DÉFILER LA VUE D'INFORMATION EN ÉMETTANT window.ScrollTo.
Chris B. Behrens
67
@ ChrisB.Behrens Ce n'est pas toujours le cas. Cette erreur particulière peut également être donnée lorsqu'un élément est couvert par un autre. J'ai eu cette exception en essayant de cliquer sur un bouton qui était un autre élément avec une position fixe.
Martin Cassidy
4
Ce n'est pas seulement Chromedriver- avait le même problème avec Firefox. J'ai résolu le problème en implémentant un délai pour attendre que la page soit complètement rechargée, comme suggéré par d'autres ci-dessus.
codervince
5
Je pense que ce conseil est absolument faux pour émettre scrollTo ou faire des attentes. On dirait que l'algorithme du clic au sélénium est: 1. calculer la position de l'élément 2. faire défiler jusqu'à cette position (vous n'avez donc pas besoin de la publier vous-même) 3. cliquer sur cette position (l'exception vient de la dernière assertion qui vérifie quel élément se trouve sur cette position juste avant l'envoi de l'événement de clic réel) Mes conseils sont les suivants: 1. Vérifiez si l'élément est à l'intérieur de votre fenêtre. 2. vérifiez si l'élément est couvert par un autre (comme les menus collants), masquez-les s'il y en a, ou faites défiler manuellement avant de cliquer sans compter sur scrollTo intégré.
Vitalik Verhovodov

Réponses:

325

Cela est dû aux 3 types suivants:

1. L'élément n'est pas visible à cliquer.

Utilisez Actions ou JavascriptExecutor pour le faire cliquer.

Par actions:

WebElement element = driver.findElement(By("element_path"));

Actions actions = new Actions(driver);

actions.moveToElement(element).click().perform();

Par JavascriptExecutor:

JavascriptExecutor jse = (JavascriptExecutor)driver;

jse.executeScript("scroll(250, 0)"); // if the element is on top.

jse.executeScript("scroll(0, 250)"); // if the element is on bottom.

ou

JavascriptExecutor jse = (JavascriptExecutor)driver;

jse.executeScript("arguments[0].scrollIntoView()", Webelement); 

Cliquez ensuite sur l'élément.

2.La page est actualisée avant de cliquer sur l'élément.

Pour cela, faites patienter la page pendant quelques secondes.

3. L'élément est cliquable mais il y a un spinner / superposition dessus

Le code ci-dessous attendra la disparition de la superposition

By loadingImage = By.id("loading image ID");

WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds);

wait.until(ExpectedConditions.invisibilityOfElementLocated(loadingImage));

Cliquez ensuite sur l'élément.

Prabu Ananthakrishnan
la source
52
Il existe un troisième type de cause, à savoir que votre élément est enveloppé dans un div ou une span. La page peut être entièrement chargée et complètement dans la fenêtre d'affichage, mais Chromedriver refusera de cliquer dessus, où le pilote Web pour FF et IE n'a aucun problème. Un véritable humain n'a aucune idée que la durée existe, et le navigateur ne se soucie pas lorsque vous cliquez dessus, en tant qu'humain. Ni se déplacer ni attendre ne résoudra ce problème; soit éviter Chrome / chromedriver, soit réécrire le code HTML de la page semblent être les seules options pour les personnes dans le cas 3.
Don Simon
54
@DonSimon J'ai eu le même problème que vous. J'ai pu contourner ce problème en utilisant .SendKeys (Keys.Return) au lieu de .Click. Cela a fonctionné pour moi dans Chrome où j'avais ce problème et dans Firefox où j'avais un autre problème similaire sur ce lien particulier (ancre enveloppée dans une Div).
Peter Bernier
17
La solution suggérée par @PeterBernier fonctionne bien dans le cas où l'élément est enveloppé dans un div ou un span. En Python, j'ai utilisé .send_keys ('\ n') pour simuler le clic et contourner le problème dans Chrome.
GJ
4
Si un élément est masqué par un élément div, le code suivant le corrige. executeJavascript ("arguments [0] .click ();", selenium.findElement (locator));
EsotericNonsense
Vous pouvez également attendre que l'élément soit cliquable. wait.Until (ExpectedConditions.ElementToBeClickable (webElement));
Chielus
67

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

IJavaScriptExecutor ex = (IJavaScriptExecutor)Driver;
ex.ExecuteScript("arguments[0].click();", elementToClick);
Bart Wojtala
la source
5
Incroyable! Je me demande pourquoi le sélénium ne supprime pas la méthode click () qu'ils fournissent, étant donné qu'il existe des conditions dans lesquelles isDisplayed () et isEnabled () ne suffisent pas à cliquer sur un élément, et cela semble la seule solution. Merci!
Giovanni Bitliner
2
+1: C'est la solution qui a fonctionné pour moi. actions.MoveToElementn'a pas fonctionné pour moi en C # et les autres solutions de défilement semblaient un peu fragiles en ce sens qu'il y avait une chance que le défilement ne puisse pas correctement afficher l'élément ou que la position de l'élément sur la page puisse changer.
Utilisateur
1
cette solution est la plus simple si l'élément n'est pas en vue, mais existe sur la page
Yashveer Rana
@Giovanni Bitliner Ils ne fournissent pas cette méthode car ce n'est pas un vrai scénario utilisateur. Les utilisateurs doivent également attendre que le chargeur disparaisse. Je pense que c'est une chose merveilleuse avec le sélénium.
Gideon Mulder
+1 A également fonctionné pour moi. Je viens d'ajouter la méthode flwg à mon code: `private void jsClick (élément IWebElement, pilote IWebDriver) {IJavaScriptExecutor ex = (IJavaScriptExecutor) driver; ex.ExecuteScript ("arguments [0] .click ();", élément); } `invoqué de cette façon: 'jsClick (driver.FindElement (By.XPath (" xpathOfTheElement "))); `
Jeremias
46

Il semble y avoir un bug dans chromedriver pour cela (le problème est qu'il est marqué comme ne sera pas corrigé) -> GitHub Link

(placer une prime sur FreedomSponsors peut-être?)

Il existe une solution de contournement suggérée au commentaire # 27. Peut-être que ça fonctionnera pour vous-

Tony Lâmpada
la source
4
Cela semble juste - si le bouton n'est pas à l'écran, il n'est pas vraiment cliquable.
Evan Knowles
Ce n'est pas un bug. Il s'agit d'un comportement voulu et il est correct. Comme d'autres l'ont suggéré, si l'élément est en dehors de la fenêtre d'affichage - vous devez y faire défiler.
Alex Skrypnyk
J'ai essayé Firefox et j'ai trouvé qu'il ne donnait pas cette erreur, mais le clic était toujours ignoré. Il s'est avéré que le div parent avait une hauteur de zéro. Une fois que cela a été corrigé, les deux fonctionnaient bien.
dansalmo
35

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

XGillerX
la source
16

J'ai vu cela dans la situation où la fenêtre Chrome au sélénium a été ouverte trop petite. L'élément sur lequel cliquer était hors de la fenêtre d'affichage et, par conséquent, il échouait.

Cela semble logique ... l'utilisateur réel devrait soit redimensionner la fenêtre, soit faire défiler pour qu'il soit possible de voir l'élément et en fait de cliquer dessus.

Après avoir demandé au pilote au sélénium de définir la taille de la fenêtre de manière appropriée, ces problèmes ont disparu pour moi. L'API webdriver est décrite ici .

opichals
la source
15

Wow, beaucoup de réponses ici, et beaucoup de bonnes.

J'espère que je vais ajouter quelque chose à cela de mon expérience.

Eh bien les gars, dans mon cas, il y avait une superposition de cookies cachant parfois l'élément. Le défilement vers l'élément fonctionne également; mais à mon humble avis (pour mon cas, pas une panacée pour tout le monde) la solution la plus simple est juste de passer en plein écran (j'exécutais mes scripts sur un 3/4 de la fenêtre écran)! Alors c'est parti:

driver.manage().window().maximize();

J'espère que cela pourra aider!

Xwris Stoixeia
la source
13

ruby / watir-webdriver / chrome

J'utilise l'astuce suivante et semble fonctionner:

#scroll to myelement
@browser.execute_script "window.scrollTo(#{myelement.element.wd.location[0]},#{myelement.element.wd.location[1]})"

# click myelement
myelement.when_present.fire_event("click")
Annet
la source
1
Le problème que je voyais concernait une carte de la région. L'erreur était la même que la publication d'origine ici - une div "devant" la zone sur laquelle je devais cliquer. Ce n'était pas un problème AJAX / timing / chargement de page, et la zone était bien visible - je ne pouvais même pas faire défiler pour me concentrer dessus. Cependant, le changement de ma méthode de clic d'object.click à object.fire_event ("clic") semble avoir résolu le problème pour moi. Je l'ai laissé dans un bloc begin / rescue afin que cela n'affecte pas la façon dont Firefox clique normalement.
adam reed
Cette approche a permis de contourner le problème pour moi lorsqu'il y avait des éléments non visibles dans la fenêtre.
Jason R. Coombs
13

Moi aussi, je me suis débattu 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 en vue, je ferais défiler pour voir puis cliquer. Même le défilement dans la vue fonctionne dans Chrome, seuls les quelques pixels inférieurs de la case à cocher n'étaient pas visibles, donc le pilote Web a refusé de cliquer dessus.

Ma solution 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. De toute évidence, vous devez savoir dans quelle direction et combien vous devez parcourir pour que votre kilométrage puisse varier. Mais je préfère cela au hack javascript, donc je le poste ici au cas où quelqu'un d'autre le trouverait utile.

kolibri
la source
Locatable est déconseillé.
Steve Staple
12

J'obtenais cette erreur lors de l'exécution de tests sans tête avec xvfb-run. Ils travaillaient parfaitement sur place. En utilisant chrome, les versions de webdriver / chromedriver / chrome / java etc. sont toutes identiques.

Le bug "ne résoudra pas" dans chromedriver - GitHub Link souligné par Tony Lâmpada a suggéré que cela pourrait être lié à ce qui est / n'est pas visible à l'écran.

Le message d'aide pour xvfb-run montre ce qui suit:

-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 de xvfb a fait disparaître l'erreur:

xvfb-run -s "-screen 0 1280x1024x16" ...
u-phoria
la source
9

Lors de l'utilisation de Protractor, cela m'a aidé:

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

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ésolu le problème. Mais, la solution suivante a fonctionné pour moi jusqu'à présent. Ce qui suit est du code C # mais vous pouvez suivre la même logique dans votre langage spécifique. Ce que nous faisons ici,

Étape 1: Concentrez-vous sur l'élément à l'aide de l'objet Actions Sélénium,

É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 également. L'étape 3 fonctionnerait d'elle-même, mais j'ai remarqué un comportement étrange dans un scénario dans lequel l'étape 3, même si elle a cliqué avec succès sur l'élément, a provoqué 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();");

            }
Sujeewa
la source
J'avais ce même problème. Votre étape 1 d'utilisation de la classe Actions fonctionne très bien. Je n'aurais jamais pensé à ça. Merci!
Conner
Votre première étape est une excellente solution.
Sovandara LENG
7

J'ai fait cette méthode sur la base d'un commentaire de la réponse de Tony Lâmpada. Il fonctionne très bien.

def scroll_to(element)
  page.execute_script("window.scrollTo(#{element.native.location.x}, #{element.native.location.y})")
end
Roger Garza
la source
6

J'obtenais le même problème lors de l'exécution du script sélénium en python. Voici ce que j'avais l'habitude de cliquer sur l'élément:

from selenium.webdriver.common.action_chains import ActionChains


ActionChains(driver).click(element).perform()
psr
la source
5

J'étais confronté à un problème similaire où je dois cocher deux cases l'une après l'autre.Mais j'obtenais la même erreur ci-dessus. voici les étapes: -

  When I visit /administrator/user_profiles
  And I press xpath link "//*[@id='1']"
  Then I should see "Please wait for a moment..."
  When I wait for 5 seconds
  And I press xpath link "//*[@id='2']"
  Then I should see "Please wait for a moment..."
  When I visit /administrator/user_profiles_updates
Milind
la source
Ajoutons simplement que ce n'est pas la bonne façon d'utiliser la syntaxe de Gherkin. Les étapes doivent être sous la forme «donné - quand - alors» et ne doivent pas être mélangées. Si plus de «whens» sont nécessaires après un «alors», un cas de test distinct est probablement nécessaire.
Floella
5

Vous devez utiliser le focus ou faire défiler cet élément. Vous devrez peut-être également utiliser l'attente explicite.

WebElement firstbutton= driver.findElement(By.xpath("Your Element"));
Actions actions = new Actions(driver);
actions.moveToElement(element);
actions.perform();

OU

L'élément n'est pas cliquable à cause d'un Spinner / Overlay dessus:

By loadingImage = By.id("loading image ID");
WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds);
wait.until(ExpectedConditions.invisibilityOfElementLocated(loadingImage));

OU

Point p= element.getLocation();
Actions actions = new Actions(driver);
actions.moveToElement(element).movebyoffset(p.x,p.y).click().perform();

OU

Si vous ne travaillez toujours pas JavascriptExecutor

JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", firstbutton);
Shubham Jain
la source
3

Apparemment, cela est le résultat d'un bogue "Won't Fix" dans le binaire du pilote Chrome.

Une solution qui a fonctionné pour moi (Notre kilométrage peut varier) peut être trouvée dans cette discussion de groupe Google, Commentaire # 3:

https://groups.google.com/forum/?fromgroups=#!topic/selenium-developer-activity/DsZ5wFN52tc

La partie pertinente est ici:

J'ai depuis travaillé autour du problème en naviguant directement vers le href de l'ancre parent de la travée.

driver.Navigate (). GoToUrl (driver.FindElement (By.Id (embeddedSpanIdToClick)). FindElement (By.XPath ("..")). GetAttribute ("href"));

Dans mon cas, j'utilise Python, donc une fois que j'ai obtenu l'élément souhaité, j'ai simplement utilisé

driver.get(ViewElm.get_attribute('href'))

Je m'attends à ce que cela ne fonctionne que si l'élément sur lequel vous essayez de cliquer est un lien ...

alpheus
la source
3

J'étais confronté au même problème avec clj-webdriver (port de fermeture de Selenium). Je viens de traduire la solution précédente en clôture pour plus de commodité. Vous pouvez appeler cette fonction avant de cliquer ou quoi que ce soit 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))))
Jaime Agudo
la source
3

Cela peut se produire si l'élément change de position pendant que le pilote tente de cliquer dessus (j'ai également vu cela avec IE). Le conducteur conserve la position initiale mais au moment où il arrive à cliquer dessus, cette position ne pointe plus sur cet élément. Le pilote FireFox n'a pas ce problème BTW, apparemment il "clique" sur les éléments par programme.

Quoi qu'il en soit, cela peut se produire lorsque vous utilisez des animations ou modifiez simplement la hauteur des éléments de manière dynamique (par exemple $("#foo").height(500)). Vous devez vous assurer que vous cliquez uniquement sur les éléments une fois que leur hauteur est "réglée". Je me suis retrouvé avec du code qui ressemble à ceci (liaisons C #):

if (!(driver is FirefoxDriver))
{
    new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(
        d => d.FindElement(By.Id(someDynamicDiv)).Size.Height > initialSize);
}

Dans le cas d'une animation ou de tout autre facteur que vous ne pouvez pas facilement rechercher, vous pouvez utiliser une méthode "générique" qui attend que l'élément soit stationnaire:

var prevLocation = new Point(Int32.MinValue, Int32.MinValue);
int stationaryCount = 0;
int desiredStationarySamples = 6; //3 seconds in total since the default interval is 500ms
return new WebDriverWait(driver, timeout).Until(d => 
{
    var e = driver.FindElement(By.Id(someId));
    if (e.Location == prevLocation)
    {
        stationaryCount++;
        return stationaryCount == desiredStationarySamples;
    }

    prevLocation = e.Location;
    stationaryCount = 0;
    return false;
});
Ohad Schneider
la source
Cela semble être ce que je vis. Je reçois par intermittence l'exception "Autre élément serait ..." de l'OP, mais les captures d'écran montrent que le modal est à l'écran et l'élément n'est pas couvert et j'utilise des temps d'attente avant de cliquer. Il s'avère que lorsque le modal sur lequel je clique s'ouvre, il glisse réellement vers le bas de la page. Selon le moment où le sélénium attend les échantillons réels du DOM, l'exception peut être levée s'il a attrapé le modal pendant qu'il se déplaçait.
Levi Noecker
3

Je l'ai rencontré car une boîte de dialogue de chargement couvre cet élément. Je le résout simplement en ajoutant une attente avant de travailler avec cet élément.

try {
        Thread.sleep((int) (3000));
    } catch (InterruptedException e) {
        //
        e.printStackTrace();
    }

J'espère que cette aide!

Huy Hóm Hỉnh
la source
3

Explication du message d'erreur :

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

Il peut y avoir de nombreuses raisons pour lesquelles l'élément n'est pas visible au moment du test. Veuillez ré-analyser votre page et trouver la solution appropriée à votre cas.

Solution pour un cas particulier :

Dans mon cas, cette erreur se produit, lorsqu'une info-bulle de l'élément d'écran sur lequel je viens de cliquer apparaissait sur l'élément sur lequel je voulais cliquer. La défocalisation était une solution dont j'avais besoin.

  • Une solution rapide pour défocaliser 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 un clic.
  • Une bonne solution serait d'appeler element.blur()l'élément faisant apparaître l'info-bulle, ce qui ferait disparaître l'info-bulle.
Dee
la source
3

La raison de cette erreur est que l'élément sur lequel vous essayez de cliquer n'est pas dans la fenêtre d'affichage (région vue par l'utilisateur) du navigateur. Donc, le moyen de surmonter cela est de faire d'abord défiler jusqu'à l'élément souhaité, puis de cliquer.

Javascript:

async scrollTo (webElement) {
    await this.driver.executeScript('arguments[0].scrollIntoView(true)', webElement)
    await this.driver.executeScript('window.scrollBy(0,-150)')
}

Java:

public void scrollTo (WebElement e) {
    JavascriptExecutor js = (JavascriptExecutor) driver; 
    js.executeAsyncScript('arguments[0].scrollIntoView(true)', e)
    js.executeAsyncScript('window.scrollBy(0,-150)')
}
sri
la source
2

Concernant la réponse de Tony Lâmpada, le commentaire # 27 a effectivement résolu le problème pour moi, sauf qu'il fournissait du code Java et que j'avais besoin de Python. Voici une fonction Python qui défile jusqu'à la position de l'élément, puis clique dessus.

def scroll_to_and_click(xpath):
    element = TestUtil.driver.find_element_by_xpath(xpath)
    TestUtil.driver.execute_script('window.scrollTo(0, ' + str(element.location['y']) + ');')
    element.click()

Cela a résolu le problème pour moi dans Chrome 34.0. Cela n'a causé aucun dommage dans Firefox 28.0 et IE 11; ces navigateurs ne sont pas soumis au problème, mais faire défiler jusqu'à la position de l'élément avant de cliquer dessus n'est toujours pas une mauvaise chose.

Steve Saporta
la source
2

Ce n'est peut-être pas une solution vraiment propre, mais cela fonctionne:

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
radeklos
la source
2

J'obtenais ce bogue parce que j'ai testé un survol et que je devais ensuite cliquer sur le lien sous l'infobulle. La solution consistait à ajouter page.find('.sp-logo').hoverauparavant click_linkpour éliminer l'infobulle.

Dan Kohn
la source
2

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 fait non plus. Si votre page a le même identifiant utilisé plusieurs fois, comme le mien, ("newButton",) et que celui que vous voulez n'est pas le premier trouvé, vous obtiendrez probablement cette erreur. La chose la plus simple à 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 demandez à quiconque a réutilisé les identifiants de les corriger.

CargoMeister
la source
Si c'est parce qu'il y a plusieurs boutons par cet ID et qu'un seul est affiché à la fois, une solution supérieure consiste à utiliser LINQ pour trouver le premier élément qui est visible (ajouter .First(x => x.Visible)à l'appel FindElements) et cliquer dessus s'il n'est pas nul.
Sean Duggan
2

Après avoir testé toutes les suggestions mentionnées, rien n'a fonctionné. J'ai fait ce code. Cela fonctionne, 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();
            }
        }
    }
}
Bruno Lee
la source
2

Je fais une sorte de force brute de clics et ça marche pour moi.

try:
    elem.click()
except:
    print "failed to click"
    size = elem.size
    mid_of_y = int(size["height"])/2
    stepts_to_do_to_left = int(size["width"])
    while stepts_to_do_to_left > 0:
        try:
            print stepts_to_do_to_left, mid_of_y
            action = webdriver.common.action_chains.ActionChains(driver)
            action.move_to_element_with_offset(elem, mid_of_y, stepts_to_do_to_left)
            action.click()
            action.perform()
            print "DONE CLICK"
            break
        except:
            pass
Super mario
la source
2

Si vous avez jQuerychargé sur la page, vous pouvez exécuter la commande javascript suivante:

"$('#" + element_id + "').click()"

Exemple utilisant un exécuteur python:

driver.execute_script("$('#%s').click()" % element_id)
Zags
la source
1

J'ai eu le même problème et il a été causé par un conflit d'identité entre le div et le lien à l'intérieur du div. Donc, le chauffeur cliquait sur le div au lieu du lien que je voulais. J'ai changé l'identifiant div 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>
Jordan Silva
la source
Pas surpris que cela vous ait causé des problèmes. Il ne doit y avoir qu'un seul identifiant sur une page. Cela déroulait une mauvaise conception et non une solution de contournement.
Dave Lawrence
1

Dans Drupal lors de l'utilisation de Selenium :

    // Get element.
    $element = $this->driver->getElement('xpath=//input');        
    // Get screen location.
    $location = $element->getLocation();
    // To make sure that Chrome correctly handles clicking on the elements 
    // outside of the screen, we must move the cursor to the element's location.
    $this->driver->moveCursor($location['x'], $location['y']);

    // Optionally, set some sleep time (0.5 sec in the example below) if your
    // elements are visible after some animation.
    time_nanosleep(0, 500000000);

    // Click on the element.
    $element->click();
Alex Skrypnyk
la source