web-dev-qa-db-fra.com

Selenium Webdriver et Java. L'élément n'est pas cliquable au point (x, y). 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 délai d'attente: 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);
}
51
Maria

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

Il s’agit d’une exception org.openqa.Selenium.WebDriverException qui s’étend à une exception 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

À propos de 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 wait comme WebDriverWait wait = new WebDriverWait(driver, 10); mais que vous appelez la méthode click() sur l'élément avant que ExplicitWait entre en jeu comme dans until(ExpectedConditions.elementToBeClickable).

Solution

L'erreur Element is not clickable at point (x, y) peut provenir de différents facteurs. Vous pouvez les résoudre en utilisant l’une des procédures suivantes:

1. L'élément n'a pas été cliqué à cause de JavaScript ou de AJAX appels présents

Essayez d'utiliser Actions 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é car il ne se trouve pas dans Viewport

Essayez d'utiliser JavascriptExecutor pour amener l'élément dans la fenêtre de visualisation:

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

3. La page est en cours de rafraîchissement avant que l'élément ne puisse être cliqué.

Dans ce cas, indiquez ExplicitWait i.e WebDriverWait comme indiqué au point 4.

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

Dans ce cas, indiquez ExplicitWait avec ExpectedConditions défini 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 avec une superposition temporaire.

Dans ce cas, indiquez ExplicitWait avec ExpectedConditions défini sur invisibilityOfElementLocated pour la superposition sur Être invisible.

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

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

Utilisez 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);
127
DebanjanB

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

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

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

J'ai rencontré cette erreur en essayant de cliquer sur un élément (ou sa superposition, je m'en fichais), et les autres réponses ne fonctionnaient pas pour moi. Je l'ai corrigé en utilisant l'API elementFromPoint DOM pour trouver l'élément sur lequel Selenium voulait que je clique:

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 également rencontré des situations où un élément était en mouvement, par exemple parce qu'un élément situé au-dessus de celui-ci sur la page effectuait un développement ou un repli animé. Dans ce cas, cette classe de condition attendue a aidé. Vous lui donnez le éléments animés, pas ceux sur lesquels 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
3
rescdsk

Faire défiler la page jusqu'au point proche mentionné dans l'exception a fait l'affaire pour moi. Ci-dessous l'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 pilote Facebook php

2
Sudheesh.M.S

Tu peux essayer

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