Selenium Web Driver e Java. O elemento não é clicável no ponto (x, y). Outro elemento receberia o clique


92

Usei esperas explícitas e tenho o seguinte aviso:

org.openqa.selenium.WebDriverException: O elemento não é clicável no ponto (36, 72). Outro elemento receberia o clique: ... Duração do comando ou tempo limite: 393 milissegundos

Se eu usar Thread.sleep(2000), não recebo nenhum aviso.

@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);
}

Você está usando o Chrome versão 61+?
— demouser123

@ demouser123 estou usando o Firefox 47.0.1 e seleniumWebDriver 2.51.0
— Maria

@Maria Em qual linha você está obtendo o erro? Obrigado
— DebanjanB

@DebanjanB Na linha: driver.findElement (By.id ("navigationPageButton")). Click ();
— Maria

Esse erro significa que há outro elemento sobreposto ao elemento de destino (sobreposição de posição fixa / absoluta) ou o índice z está muito baixo. Isso pode ser causado por efeitos de foco usando transições (mais lento do que o tempo limite mínimo, neste caso 393 ms). você deve esperar para #navigationPageButtonse tornar visível (ou clicável usando elementToBeClickable()para esse elemento também) ou verificar se todas as pré-condições foram atendidas para que o botão seja clicável.
— tente pegar finalmente

Respostas:


194

WebDriverException: o elemento não é clicável no ponto (x, y)

Esta é uma org.openqa.selenium.WebDriverException típica que estende java.lang.RuntimeException .

Os campos desta exceção são:

  • 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

Sobre o seu caso de uso individual, o erro diz tudo:

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

Está claro em seu bloco de código que você definiu o waitcomo, WebDriverWait wait = new WebDriverWait(driver, 10);mas está chamando o click()método no elemento antes de ExplicitWaitentrar em jogo como em until(ExpectedConditions.elementToBeClickable).

Solução

O erro Element is not clickable at point (x, y)pode surgir de diferentes fatores. Você pode resolvê-los por um dos seguintes procedimentos:

1. O elemento não está sendo clicado devido à presença de chamadas JavaScript ou AJAX

Tente usar a Actionsclasse:

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

2. O elemento não está sendo clicado porque não está dentro da janela de visualização

Tente usar JavascriptExecutorpara trazer o elemento dentro da janela de visualização:

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

3. A página está sendo atualizada antes que o elemento seja clicável.

Neste caso, induza ExplicitWait, ou seja, WebDriverWait, conforme mencionado no ponto 4.

4. O elemento está presente no DOM, mas não é clicável.

Nesse caso, induza ExplicitWait com ExpectedConditionsdefinido como elementToBeClickablepara que o elemento seja clicável:

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

5. O elemento está presente, mas com sobreposição temporária.

Neste caso, induza ExplicitWaitcom ExpectedConditionsdefinido como invisibilityOfElementLocatedpara que a Sobreposição fique invisível.

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

6. O elemento está presente, mas com sobreposição permanente.

Use JavascriptExecutorpara enviar o clique diretamente no elemento.

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

1
Para # 6 / # 2 acima: O método .ExecuteScript agora está acessível a partir do próprio driver da web em vez do JavascriptExecutor. Obrigado pela resposta bem escrita!
— Tabrock de

6
Você cobriu muitas possibilidades nas quais apenas 5 e 6 são a maneira correta de lidar com o erro mencionado. Os primeiros quatro geram erros diferentes para os quais a solução que você deu não funcionará. Para um exemplo, o ponto número 3 é na verdade um problema de elemento obsoleto que não funcionaria, mesmo que você espere com o método elementToBeClickble. Isso tem que ser tratado de forma diferente.
— Rajagopalan

6 não está realmente correto; um hack para contornar o problema, 5 estaria correto se a condição esperada correta estivesse sendo usada. 4 parece ser a única resposta correta.
— Ardesco

1
Uma coisa importante a notar é que, quando estamos emulando as ações do usuário, pode ser muito indesejável usar javascript para clicar em um elemento que não pode ser clicado de forma alguma (# 6). O usuário final nunca faria isso, ele apenas iria rolar até o elemento para trazê-lo para a janela de visualização ou dispensar qualquer sobreposição (se permitido pela página) para interagir com ele.
— p_champ

18

Caso precise usá-lo com Javascript

Podemos usar os argumentos [0] .click () para simular a operação de clique.

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

Trabalho! Não consigo imaginar como isso funciona, mas, caso contrário, ele clica na camada de sobreposição (a espera do fechamento da sobreposição por 'invisibilityOfElementLocated' leva cerca de 30 segundos).
— Fisk

Você pode escrever a explicação completa, já que escrevo em java e não é uma guerra familiar, você pode fornecer o fluxo completo?
— Bastian

4

Encontrei este erro ao tentar clicar em algum elemento (ou em sua sobreposição, não me importei) e as outras respostas não funcionaram para mim. Corrigi-o usando a elementFromPointAPI DOM para encontrar o elemento em que Selenium queria que eu clicasse:

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()

Também tive situações em que um elemento estava se movendo , por exemplo, porque um elemento acima dele na página estava fazendo uma expansão ou recolhimento animado. Nesse caso, a classe Expected Condition ajudou. Você atribui a ele os elementos animados , não aqueles em que deseja clicar. Esta versão só funciona para animações 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

2

Podes tentar

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

Não me ajuda.
— Maria

Sim: org.openqa.selenium.WebDriverException: o elemento não é clicável no ponto (36, 72). Outro elemento receberia o clique: <div tabindex = "0" class = "waiter-ui-lock"> </div> Duração do comando ou tempo limite: 70 milissegundos
— Maria

1
tente o seguinteWebElement element = driver.findElement(By.id("navigationPageButton")); Actions actions = new Actions(driver); actions.moveToElement(element).click().perform();
— fg78nc

Isso também não ajuda. Eu tenho dois Exception e um AssertionError e, em seguida, algum erro "O elemento não é clicável no ponto"
— Maria

1
Se eu estiver usando Thread.Sleep, tudo funcionará. Mas estou usando Wait all fail.
— Maria

2

Rolar a página até o ponto próximo mencionado na exceção funcionou para mim. Abaixo está o snippet de código:

$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);");

NOTA: Eu uso o Facebook php webdriver


0

A melhor solução é substituir a funcionalidade de clique:

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;
        }
    }
}

0

Em C #, tive problemas com a verificação RadioButtone funcionou para mim:

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

0

Pode tentar com o código abaixo

 WebDriverWait wait = new WebDriverWait(driver, 30);

Passe outro elemento receberia o clique :<a class="navbar-brand" href="#"></a>

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

Passe o id do botão clicável conforme mostrado abaixo

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

0

Se o elemento não for clicável e o problema de sobreposição estiver ocorrendo, usamos os argumentos [0] .click ().

WebElement ele = driver.findElement (By.xpath ("// div [@ class = 'input-group-btn'] / input")); JavascriptExecutor executor = (JavascriptExecutor) driver; executor.executeScript ("arguments [0] .click ();", ele);

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.