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 situe sur le côté de l'élément en question, et non au-dessus de celui-ci, et ne le chevauche pas, ne se déplace pas autour de la page.
J'ai essayé d'ajouter un décalage, mais cela ne fonctionne pas non plus. L'élément est dans la fenêtre affichée sans avoir besoin de faire défiler.
Ceci est causé par 3 types suivants:
_ {1.L'élément n'est pas visible au clic. _
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);
Puis cliquez sur l'élément.
_ {2.La page est en cours de rafraîchissement 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 disque/une superposition dessus} _
Le code ci-dessous attendra que la superposition disparaisse
By loadingImage = By.id("loading image ID");
WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds);
wait.until(ExpectedConditions.invisibilityOfElementLocated(loadingImage));
Puis cliquez sur l'élément.
Vous pouvez également utiliser un clic JavaScript et le défilement ne serait alors plus nécessaire.
IJavaScriptExecutor ex = (IJavaScriptExecutor)Driver;
ex.ExecuteScript("arguments[0].click();", elementToClick);
Il semble y avoir un bogue dans chromedriver pour cela (le problème est qu’il est marqué comme ne corrigera pas) --> GitHub Link
(Placez une prime sur FreedomSponsors peut-être?)
Une solution de contournement est suggérée dans le commentaire n ° 27 . Peut-être que cela fonctionnera pour vous.
J'avais le même problème, j'essayais toutes les solutions proposées mais elles ne fonctionnaient pas 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
Je l'ai vu dans le cas où la fenêtre Chrome pilotée par Selenium était ouverte trop petite. L'élément à cliquer était hors de la fenêtre d'affichage et par conséquent, il échouait.
Cela semble logique ... un utilisateur réel devrait redimensionner la fenêtre ou faire défiler l'écran pour qu'il soit possible de voir l'élément et de cliquer dessus.
Après avoir demandé au pilote Selenium de régler la taille de la fenêtre de manière appropriée, ces problèmes sont partis pour moi. L'API webdriver est décrit ici .
Wow, beaucoup de réponses ici, et beaucoup de bonnes.
J'espère y ajouter quelque chose de mon expérience.
Eh bien les gars, dans mon cas, il y avait un recouvrement de cookie qui cachait l'élément de temps en temps… .. Le défilement jusqu'à l'élément fonctionne également; mais à mon humble avis (dans mon cas, pas une panacée pour tout le monde), la solution la plus simple consiste simplement à passer en plein écran (je courais mes scripts sur un 3/4 de la fenêtre de l'écran)! Alors on y va:
driver.manage().window().maximize();
J'espère que cela pourra aider!
Moi aussi j'ai lutté avec ce problème. Le code fonctionne bien en FF, échoue sous Chrome. Ce que j'essayais de faire était de cocher une case à cocher - si ce n'était pas visible, je ferais défiler pour voir et ensuite cliquer. Même le défilement dans la vue fonctionne sous Chrome, seuls les quelques pixels en bas de la case à cocher n'étant pas visibles, WebDriver 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, il est parfois nécessaire d’utiliser Actions. De toute évidence, vous devez savoir dans quelle direction et combien vous devez parcourir pour que votre kilométrage varie. Mais je préfère ceci au javascript, alors je le publie ici au cas où quelqu'un le trouverait utile.
Ruby/watir-webdriver/chrome
J'utilise le truc suivant et il semble que ça marche:
#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")
Obtenait cette erreur en exécutant des 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 bogue "won’t fix" dans chromedriver - GitHub Link signalé par Tony Lâmpada a suggéré que cela pouvait être lié à ce qui est/n'est pas visible à l’écran.
Un message d'aide pour xvfb-run indique 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" ...
Lors de l’utilisation de Rapporteur cela m’a aidé:
var Elm = element(by.css('.your-css-class'));
browser.executeScript("arguments[0].scrollIntoView();", Elm.getWebElement());
Elm.click();
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 est
Étape 1: Concentrez-vous sur l'élément à l'aide de l'objet Selenium Actions.
Étape 2: Ensuite, faites un clic sur l'élément
Étape 3: S'il existe 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 de navigateur Selenium.
Vous pouvez également ignorer les étapes 1 et 2 et n'essayer que l'étape 3. 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 avait cliqué 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();");
}
J'avais le même problème en exécutant le script Selenium 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()
J'ai créé cette méthode à partir 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
J'étais confronté à un problème similaire car je devais cocher deux cases à la suite.Mais j'obtenais la même erreur ci-dessus. Par conséquent, j'ai ajouté une attente entre mes démarches pour cocher les cases à cocher ... ça marche très bien. 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
Apparemment, c'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 n ° 3:
https://groups.google.com/forum/?fromgroups=#!topic/Selenium-developer-activity/DsZ5wFN52tc
La partie pertinente est ici:
Depuis, j'ai résolu le problème en naviguant directement dans le href de l'ancre parente 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 eu l'élément désiré, j'ai simplement utilisé
driver.get(ViewElm.get_attribute('href'))
Je pense que cela ne fonctionnera que si l'élément sur lequel vous essayez de cliquer est un lien ...
Cela peut se produire si l'élément change de position pendant que le pilote tente de cliquer dessus (je l'ai aussi vu avec IE). Le pilote conserve la position initiale, mais au moment où il clique dessus, cette position ne pointe plus vers 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 que vous modifiez simplement la hauteur d'éléments de manière dynamique (par exemple, $("#foo").height(500)
). Vous devez vous assurer de ne cliquer que sur les éléments une fois leur hauteur réglée. J'ai fini avec un 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 interroger, vous pouvez utiliser une méthode "générique" qui attend que l'élément soit immobile:
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;
});
J'ai rencontré cela parce qu'une couverture de dialogue de chargement sur cet élément. Je résous simplement en ajoutant une attente avant de travailler avec l'élément this.
try {
Thread.sleep((int) (3000));
} catch (InterruptedException e) {
//
e.printStackTrace();
}
J'espère que cette aide!
Je faisais face au même problème avec clj-webdriver (port clojure de Selenium) Je viens de traduire la solution précédente en clojure 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))))
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 couvert par quelque chose ou temporaire non visible.
Plusieurs raisons peuvent expliquer pourquoi 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 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 vient s'afficher par-dessus l'élément sur lequel je voulais cliquer ensuite. Defocus était une solution dont j'avais besoin.
element.blur()
sur l'élément affichant l'info-bulle, ce qui ferait disparaître l'info-bulle. Je fais une sorte de force brute de clics et cela fonctionne 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
La raison de cette erreur est que l'élément sur lequel vous essayez de cliquer ne se trouve pas dans la fenêtre d'affichage (région vue par l'utilisateur) du navigateur. Pour résoudre ce problème, sélectionnez d'abord l'élément souhaité, puis cliquez.
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)')
}
Si vous avez jQuery
chargé 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)
Après avoir testé toutes les suggestions mentionnées, rien n’a fonctionné. J'ai fait ce code. Ça marche, mais c'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();
}
}
}
}
C'est drôle, tout le temps que j'ai passé à regarder les différentes réponses, personne n'avait essayé l'évidence, ce que je n'avais évidemment 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 ne soit pas le premier trouvé, vous obtiendrez probablement l'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 demandez à quiconque réutilisé les identifiants de les réparer.
Concernant la réponse de Tony Lâmpada, le commentaire n ° 27 a en effet 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 fait défiler 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 sujets au problème, mais le défilement de la position de l'élément avant de cliquer dessus n'est toujours pas une mauvaise chose.
J'avais eu ce bogue parce que j'avais testé un vol stationnaire et que j'avais ensuite besoin de cliquer sur le lien sous l'infobulle. La solution a été d'ajouter page.find('.sp-logo').hover
avant click_link
pour obtenir l'info-bulle.
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
Un autre bogue empêchait find_link
sur Chrome et Poltergeist de cliquer sur une balise A avec une balise EM et du texte à l'intérieur, même si cela fonctionnait correctement dans Firefox et rack_test. La solution consistait à remplacer click_link(link)
par:
find('a em', text: link).click
J'ai eu la même exception en essayant de cliquer sur l'un des boutons radio de ma page. J'ai utilisé le code Javascript ci-dessous et je l'ai supprimé avec IJavaScriptExecutor. C # exemple
string script=" function clickCharity() {"+
"var InputElements = document.getElementsByName('Charity');"+
"for (i=0; i<InputElements.length; i++){"+
"if(InputElements[i].getAttribute('value') == 'true')"+
"{"+
"InputElements[i].click();"+
"}"+
"}"+
"}";
var js=WebDriver as IJavaScriptExecutor;
js.ExecuteScript(script);
Au lieu de
webdriver.findElement(By.id("id1")).click();
essayez d'utiliser
click(By.id("id1"));
void click(final By byLocator) {
waitFor(new ExpectedCondition<Boolean>() {
@Override
public Boolean apply(WebDriver driver) {
WebElement element = driver.findElement(byLocator);
if (element.isDisplayed()) {
try {
element.click();
return true;
} catch (Exception e) {
e.printStackTrace();
}
}
return false;
}
@Override
public String toString() {
return "Element located " + byLocator + " clicked";
}
});
}
J'ai également été bloqué pendant deux jours pour la même raison. En fait, le défilement le fera fonctionner, car il se peut que les données ne puissent pas être chargées correctement, ce qui peut provoquer la même erreur encore et encore.
Ce que j’ai fait, c’est, je fais défiler au hasard, une fois avec (0, -500), puis (0,400), puis (0.-600), vous faites donner à ces valeurs de défilement la valeur qui vous convient. Il suffit de le faire défiler là où vous avez le contenu à cliquer.
driver.execute_script("scrollBy(0,-500);")
sleep(5)
driver.execute_script("scrollBy(0,400);")
sleep(5)
driver.execute_script("scrollBy(0,-600);")
sleep(5)
Cela a vraiment fonctionné :)
Dans Drupal avec 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();
J'ai eu le même problème et j'ai eu l'erreur 'l'autre élément recevrait le clic' pour un élément visible affiché. Je n'ai trouvé aucune autre solution que de 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é
Dans Visual Studio 2013, si vous activez BrowserLink, une barre de navigation BrowserLink s'affiche en bas de l'écran. Si l'élément sur lequel vous souhaitez cliquer se trouve derrière cette barre de navigation, l'erreur est générée. La désactivation de BrowserLink a résolu le problème pour moi.
J'ai eu le même problème et il a été causé par un conflit d'identifiant entre la div et le lien à l'intérieur de la div. Donc, le pilote cliquait sur le div au lieu du lien que je voulais .. J'ai changé le div id et cela fonctionnait 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 et j'ai passé des heures à trouver la solution. J'ai essayé de cliquer sur une cellule au bas d'un long ngGrid à l'aide d'un rapporteur. Voici un aperçu de mon ngGrid html:
....many rows here..
<!- row in renderedRows ->
<!- column in renderedColumns ->
<div ...> <a ngclick="selectRow(row)"...>the test link 100000</a>...
....
toute la fonction de clic n'a pas fonctionné. La solution consiste à utiliser évaluer dans la portée actuelle de l'élément:
element(by.cssContainingText("a", "the test link 100000"))
.evaluate("selectRow(row)")
J'ai rencontré ce problème et cela semble être causé (dans mon cas) en cliquant sur un élément qui fait apparaître un div devant l'élément cliqué. J'ai contourné cela en plaçant mon clic dans un grand bloc de prises d'essais.
Vous pouvez simuler un clic avec JS:
public void click(WebElement element) {
JavascriptExecutor js =(JavascriptExecutor)driver;
js.executeScript("document.elementFromPoint(" + element.getLocation().x + "," + element.getLocation().y + ").click();");
}
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(15));
wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(By.<Id or anything>));
J'espère que cela t'aides.
Vous devez utiliser le focus ou faire défiler cet élément. Vous devrez peut-être également utiliser attendre explicitement.
WebElement firstbutton= driver.findElement(By.xpath("Your Element"));
Actions actions = new Actions(driver);
actions.moveToElement(element);
actions.perform();
OR
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));
OR
Point p= element.getLocation();
Actions actions = new Actions(driver);
actions.moveToElement(element).movebyoffset(p.x,p.y).click().perform();
OR
Si cela ne fonctionne toujours pas, utilisez JavascriptExecutor
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", firstbutton);
Cela pourrait aider quelqu'un qui utilise WebdriverIO:
function(){
var runInBrowser = function(argument) {
argument.click();
};
var elementToClickOn = browser.$('element');
browser.execute(runInBrowser, elementToClickOn);
}
Source: https://www.intricatecloud.io/2018/11/webdriverio-tips-element-wrapped-in-div-is-not-clickable/
Dans mon cas, cela a fonctionné dans Firefox mais a échoué dans Chrome. Dans Chrome, cela a été corrigé après la mise à jour de la version du pilote Chrome.
Dans Rselenium, cela s'est produit avec un code utilisé avec succès à plusieurs reprises lorsqu'un lien était positionné sur la bordure de la fenêtre supérieure. La solution simple consistait à utiliser sendKeysToElement () comme suit.
if (unlist(webElem$isElementDisplayed())) {
webElem$sendKeysToElement(list(key = "up_arrow")) # Add "up arrow"..
webElem$clickElement() # ... before $clickElement
Je suis confronté au même problème et j’ai utilisé le délai et cela fonctionne bien de mon côté. Page recevait une actualisation et obtenait les autres localisateurs.
Thread.sleep(2000);
Click(By.xpath("//*[@id='instructions_container']/a"));
Si vous utilisez la ligne ci-dessous dans votre fichier conf.js, commentez-la et essayez à nouveau.
browser.ignoreSynchronization = true;
Essayez de maximiser le navigateur lorsque vous travaillez avec des résolutions supérieures à 1024x768.
driver.manage().window().maximize();