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);
}
Maria
fonte
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);
DebanjanB
fonte
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);
Teste Rester
fonte
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
rescdsk
fonte
2

Podes tentar

WebElement navigationPageButton = (new WebDriverWait(driver, 10))
 .until(ExpectedConditions.presenceOfElementLocated(By.id("navigationPageButton")));
navigationPageButton.click();
fg78nc
fonte
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

Sudheesh.MS
fonte
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;
        }
    }
}
user2274204
fonte
0

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

driver.ExecuteJavaScript("arguments[0].checked=true", radio);
Ayub
fonte
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();
    }
Nagarjuna Yalamanchili
fonte
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);

sweta kumari
fonte