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

91

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). L'autre élément recevrait le clic: ... Durée ou délai de la commande: 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);
}
Maria
la source
Utilisez-vous la version 61+ de Chrome?
demouser123
@ demouser123 J'utilise Firefox 47.0.1 et seleniumWebDriver 2.51.0
Maria
@Maria Sur quelle ligne obtenez-vous l'erreur? Merci
DebanjanB
@DebanjanB En ligne: driver.findElement (By.id ("navigationPageButton")). Click ();
Maria le
Cette erreur signifie qu'il y a un autre élément qui recouvre l'élément cible (superposition positionnée fixe / absolue) ou que le z-index est trop bas. Cela peut être dû à des effets de survol utilisant des transitions (plus lents que le délai minimum, dans ce cas 393 ms). vous devez attendre pour #navigationPageButtondevenir visible (ou cliquer elementToBeClickable()sur cet élément également) ou vérifier si toutes les conditions préalables sont remplies pour que le bouton soit cliquable.
try-catch-finally

Réponses:

192

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

Il s'agit d'une org.openqa.selenium.WebDriverException typique qui étend 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 est clair d'après votre bloc de code que vous avez défini le waitas WebDriverWait wait = new WebDriverWait(driver, 10);mais que vous appelez la click()méthode sur l'élément avant que le ExplicitWaitn'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 y remédier par l'une des procédures suivantes:

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

Essayez d'utiliser la Actionsclasse:

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 n'est pas dans la fenêtre

Essayez d'utiliser JavascriptExecutorpour amener l'élément dans la fenêtre:

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

3. La page est actualisée avant que l'élément ne soit cliquable.

Dans ce cas, indiquez ExplicitWait, c'est-à-dire WebDriverWait, comme mentionné au point 4.

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

Dans ce cas, induisez ExplicitWait avec ExpectedConditionsla valeur de elementToBeClickablepour 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 ExplicitWaitavec ExpectedConditionsset to invisibilityOfElementLocatedpour 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 ayant une superposition permanente.

Utilisez JavascriptExecutorpour 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);
DebanjanB
la source
1
To # 6 / # 2 ci-dessus: La méthode .ExecuteScript est désormais accessible depuis le pilote Web lui-même plutôt que depuis JavascriptExecutor. Merci pour la réponse bien écrite!
Tabrock
6
Vous avez couvert de nombreuses possibilités dans lesquelles seuls 5 et 6 sont une manière correcte de gérer l'erreur mentionnée. Les quatre premiers lancent une erreur différente pour laquelle la solution que vous avez donnée ne fonctionnera pas. Pour un exemple, le point numéro 3 est en fait un problème d'élément périmé qui ne fonctionnerait pas même si vous attendez avec la méthode elementToBeClickble. Cela doit être géré différemment.
Rajagopalan
6 n'est pas vraiment correct; un hack pour contourner le problème, 5 serait correct si la condition attendue correcte était utilisée. 4 semble être la seule bonne réponse.
Ardesco
1
Une chose importante à noter est que lorsque nous émulons les actions de l'utilisateur, il peut être très indésirable d'utiliser javascript pour cliquer sur un élément sur lequel il est impossible de cliquer du tout (# 6). L'utilisateur final ne ferait jamais cela, il ferait simplement défiler jusqu'à l'élément pour l'afficher dans la fenêtre ou rejetterait toute superposition (si la page le permettait) pour interagir avec lui.
p_champ
17

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);
Test du Rester
la source
Travaux! Je ne peux pas imaginer comment cela fonctionne, mais sinon, il clique sur la couche de superposition (l'attente de la fermeture de la superposition par «invisibilityOfElementLocated» prend environ 30 secondes).
Fisk
Pouvez-vous s'il vous plaît écrire l'explication complète puisque j'écris en java et que ce n'est pas une guerre familière, pouvez-vous s'il vous plaît fournir un flux complet?
Bastian
4

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' elementFromPointAPI DOM 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 également eu des situations où un élément se déplaçait , par exemple parce qu'un élément au-dessus de lui sur la page effectuait un développement ou un repli animé animé. Dans ce cas, cette classe de condition attendue a aidé. Vous lui donnez les éléments qui sont 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
rescdsk
la source
2

Tu peux essayer

WebElement navigationPageButton = (new WebDriverWait(driver, 10))
 .until(ExpectedConditions.presenceOfElementLocated(By.id("navigationPageButton")));
navigationPageButton.click();
fg78nc
la source
Cela ne m'aide pas.
Maria le
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 ou délai de la commande: 70 millisecondes
Maria
1
essayez ce qui suitWebElement element = driver.findElement(By.id("navigationPageButton")); Actions actions = new Actions(driver); actions.moveToElement(element).click().perform();
fg78nc
Cela n'aide pas non plus. J'ai deux exceptions et une AssertionError et ensuite une erreur "L'élément n'est pas cliquable au point"
Maria
1
Si j'utilise Thread.Sleep, tout fonctionne. Mais j'utilise Wait all échoue.
Maria le
2

Faire défiler la page jusqu'au point proche mentionné dans l'exception a fait l'affaire pour moi. 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);");

REMARQUE: j'utilise Facebook php webdriver

Sudheesh.MS
la source
0

La meilleure solution consiste à remplacer la fonctionnalité de clic:

public void _click(WebElement element){
    boolean flag = false;
    while(true) {
        try{
            element.click();
            flag=true;
        }
        catch (Exception e){
            flag = false;
        }
        if(flag)
        {
            try{
                element.click();
            }
            catch (Exception e){
                System.out.printf("Element: " +element+ " has beed clicked, Selenium exception triggered: " + e.getMessage());
            }
            break;
        }
    }
}
user2274204
la source
0

En C #, j'ai eu des problèmes de vérification RadioButton, et cela a fonctionné pour moi:

driver.ExecuteJavaScript("arguments[0].checked=true", radio);
Ayub
la source
0

Peut essayer avec le code ci-dessous

 WebDriverWait wait = new WebDriverWait(driver, 30);

Passer un autre élément recevrait le clic :<a class="navbar-brand" href="#"></a>

    boolean invisiable = wait.until(ExpectedConditions
            .invisibilityOfElementLocated(By.xpath("//div[@class='navbar-brand']")));

Passez l'identifiant du bouton cliquable comme indiqué ci-dessous

    if (invisiable) {
        WebElement ele = driver.findElement(By.xpath("//div[@id='button']");
        ele.click();
    }
Nagarjuna Yalamanchili
la source