94 votes

Pilote Web Selenium et Java. L'élément n'est pas cliquable au point (x, y). Un autre élément recevrait le clic

J'ai utilisé des attentes explicites et j'ai l'avertissement :

org.openqa.selenium.WebDriverException : L'élément n'est pas cliquable au point (36, 72). Un autre élément recevrait le clic : ... Durée de la commande ou timeout : 393 millisecondes

Si j'utilise Thread.sleep(2000) Je ne reçois aucun avertissement.

@Test(dataProvider = "menuData")
public void Main(String btnMenu, String TitleResultPage, String Text) throws InterruptedException {
    WebDriverWait wait = new WebDriverWait(driver, 10);
    driver.findElement(By.id("navigationPageButton")).click();

    try {
       wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector(btnMenu)));
    } catch (Exception e) {
        System.out.println("Oh");
    }
    driver.findElement(By.cssSelector(btnMenu)).click();
    Assert.assertEquals(driver.findElement(By.cssSelector(TitleResultPage)).getText(), Text);
}

0 votes

Utilisez-vous la version 61+ de Chrome ?

0 votes

@demouser123 J'utilise Firefox 47.0.1 et seleniumWebDriver 2.51.0.

0 votes

@Maria Sur quelle ligne obtenez-vous l'erreur ? Merci

197voto

New contributor Points 31198

WebDriverException : L'élément n'est pas cliquable au point (x, y)

Il s'agit d'un cas typique org.openqa.selenium.WebDriverException qui prolonge java.lang.RuntimeException .

Les champs de cette exception sont :

  • BASE_SUPPORT_URL : protected static final java.lang.String BASE_SUPPORT_URL
  • DRIVER_INFO : public static final java.lang.String DRIVER_INFO
  • SESSION_ID : public static final java.lang.String SESSION_ID

En ce qui concerne votre cas d'utilisation individuel, l'erreur dit tout :

WebDriverException: Element is not clickable at point (x, y). Other element would receive the click 

Il ressort clairement de votre bloc de code que vous avez défini la fonction wait como WebDriverWait wait = new WebDriverWait(driver, 10); mais vous appelez le click() sur l'élément avant la méthode ExplicitWait entre en jeu comme dans until(ExpectedConditions.elementToBeClickable) .

Solution

L'erreur Element is not clickable at point (x, y) peut découler de différents facteurs. Vous pouvez les traiter par l'une des procédures suivantes :

1. L'élément n'est pas cliqué en raison de la présence d'appels JavaScript ou AJAX.

Essayez d'utiliser Actions La classe :

WebElement element = driver.findElement(By.id("navigationPageButton"));
Actions actions = new Actions(driver);
actions.moveToElement(element).click().build().perform();

2. L'élément n'est pas cliqué parce qu'il n'est pas dans la liste des éléments. Fenêtre de visualisation

Essayez d'utiliser JavascriptExecutor pour faire apparaître l'élément dans la fenêtre d'affichage :

WebElement myelement = driver.findElement(By.id("navigationPageButton"));
JavascriptExecutor jse2 = (JavascriptExecutor)driver;
jse2.executeScript("arguments[0].scrollIntoView()", myelement); 

3. La page est rafraîchie avant que l'élément ne devienne cliquable.

Dans ce cas, induire ExplicitWait i.e WebDriverWait comme mentionné au point 4.

4. L'élément est présent dans le DOM mais n'est pas cliquable.

Dans ce cas, induire ExplicitWait avec ExpectedConditions réglé sur elementToBeClickable pour que l'élément soit cliquable :

WebDriverWait wait2 = new WebDriverWait(driver, 10);
wait2.until(ExpectedConditions.elementToBeClickable(By.id("navigationPageButton")));

5. L'élément est présent mais sa superposition est temporaire.

Dans ce cas, induire ExplicitWait avec ExpectedConditions réglé sur invisibilityOfElementLocated pour que la superposition soit invisible.

WebDriverWait wait3 = new WebDriverWait(driver, 10);
wait3.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("ele_to_inv")));

6. L'élément est présent mais a une superposition permanente.

Utilice JavascriptExecutor pour envoyer le clic directement sur l'élément.

WebElement ele = driver.findElement(By.xpath("element_xpath"));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", ele);

1 votes

Pour #6/#2 ci-dessus : La méthode .ExecuteScript est maintenant accessible à partir du pilote web lui-même plutôt que du JavascriptExecutor. Merci pour cette réponse bien écrite !

8 votes

Vous avez couvert de nombreuses possibilités, parmi lesquelles seules 5 et 6 sont correctes pour traiter l'erreur mentionnée. Les quatre premiers lancent des erreurs différentes pour lesquelles la solution que vous avez donnée ne fonctionnera pas. Par exemple, le point numéro 3 est en fait un problème d'élément périmé qui ne fonctionnera pas, même si vous attendez longtemps avec la méthode elementToBeClickble. Ce problème doit être traité différemment.

0 votes

6 n'est pas vraiment correct, c'est un hack pour contourner le problème, 5 serait correct si la condition attendue correcte était utilisée. La 4 semble être la seule réponse correcte.

19voto

Rester Test Points 111

Au cas où vous auriez besoin de l'utiliser avec Javascript

Nous pouvons utiliser arguments[0].click() pour simuler l'opération de clic.

var element = element(by.linkText('webdriverjs'));
browser.executeScript("arguments[0].click()",element);

0 votes

Travaux ! Je ne peux pas imaginer comment cela fonctionne, mais autrement, il clique sur la couche d'overlay (l'attente de la fermeture de l'overlay par 'invisibilityOfElementLocated' prend environ 30sec.).

0 votes

Pouvez-vous s'il vous plaît écrire l'explication complète puisque j'écris en java et ce n'est pas une guerre familière, pouvez-vous s'il vous plaît fournir le flux complet ?

4voto

rescdsk Points 4136

J'ai rencontré cette erreur en essayant de cliquer sur un élément (ou sa superposition, peu importe), et les autres réponses n'ont pas fonctionné pour moi. J'ai résolu le problème en utilisant l'option elementFromPoint DOM API pour trouver l'élément sur lequel Selenium voulait que je clique à la place :

element_i_care_about = something()
loc = element_i_care_about.location
element_to_click = driver.execute_script(
    "return document.elementFromPoint(arguments[0], arguments[1]);",
    loc['x'],
    loc['y'])
element_to_click.click()

J'ai aussi eu des situations où un élément était déménagement par exemple parce qu'un élément situé au-dessus de lui sur la page effectuait une expansion ou un effondrement animé. Dans ce cas, la classe Expected Condition a été utile. Vous lui donnez l'attribut les éléments qui sont animés et non ceux que vous voulez cliquer. Cette version ne fonctionne que pour les animations jQuery.

class elements_not_to_be_animated(object):
    def __init__(self, locator):
        self.locator = locator

    def __call__(self, driver):
        try:
            elements = EC._find_elements(driver, self.locator)
            # :animated is an artificial jQuery selector for things that are
            # currently animated by jQuery.
            return driver.execute_script(
                'return !jQuery(arguments[0]).filter(":animated").length;',
                elements)
        except StaleElementReferenceException:
            return False

2voto

fg78nc Points 2371

Vous pouvez essayer

WebElement navigationPageButton = (new WebDriverWait(driver, 10))
 .until(ExpectedConditions.presenceOfElementLocated(By.id("navigationPageButton")));
navigationPageButton.click();

0 votes

Ça ne m'aide pas.

0 votes

Oui : org.openqa.selenium.WebDriverException : L'élément n'est pas cliquable au point (36, 72). Un autre élément recevrait le clic : <div tabindex="0" class="waiter-ui-lock"></div> Durée de la commande ou timeout : 70 millisecondes

1 votes

Essayez ce qui suit WebElement element = driver.findElement(By.id("navigationPageButton")); Actions actions = new Actions(driver); actions.moveToElement(element).click().perform();

2voto

Sudheesh.M.S Points 35

En faisant défiler la page jusqu'au point le plus proche mentionné dans l'exception, j'ai réussi. Voici un extrait de code :

$wd_host = 'http://localhost:4444/wd/hub';
$capabilities =
    [
        \WebDriverCapabilityType::BROWSER_NAME => 'chrome',
        \WebDriverCapabilityType::PROXY => [
            'proxyType' => 'manual',
            'httpProxy' => PROXY_DOMAIN.':'.PROXY_PORT,
            'sslProxy' => PROXY_DOMAIN.':'.PROXY_PORT,
            'noProxy' =>  PROXY_EXCEPTION // to run locally
        ],
    ];
$webDriver = \RemoteWebDriver::create($wd_host, $capabilities, 250000, 250000);
...........
...........
// Wait for 3 seconds
$webDriver->wait(3);
// Scrolls the page vertically by 70 pixels 
$webDriver->executeScript("window.scrollTo(0, 70);");

NOTE : J'utilise Facebook php webdriver

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X