Depuração “Elemento não é clicável no ponto”

Eu vejo isso apenas no Chrome.

A mensagem de erro completa diz:

“org.openqa.selenium.WebDriverException: Elemento não é clicável no ponto (411, 675). Outro elemento receberia o clique: …”

O elemento que ‘receberia o clique’ está ao lado do elemento em questão, não em cima dele e não se sobrepondo, não se movendo pela página.

Eu tentei adicionar um deslocamento, mas isso não funciona. O item está na janela exibida sem necessidade de rolagem.

    Isso é causado pelos seguintes 3 tipos:

    1.O elemento não é visível para clicar.

    Use Actions ou JavascriptExecutor para clicar.

    Por ações:

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

    Por JavascriptExecutor:

     JavascriptExecutor jse = (JavascriptExecutor)driver; jse.executeScript("scroll(250, 0)"); // if the element is on top. jse.executeScript("scroll(0, 250)"); // if the element is on bottom. 

    ou

     JavascriptExecutor jse = (JavascriptExecutor)driver; jse.executeScript("arguments[0].scrollIntoView()", Webelement); 

    Em seguida, clique no elemento.

    2.A página está sendo atualizada antes de clicar no elemento.

    Para isso, faça a página aguardar alguns segundos.

    3. O elemento é clicável, mas há um spinner / overlay em cima dele

    O código abaixo aguardará até que a sobreposição seja exibida

     By loadingImage = By.id("loading image ID"); WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds); wait.until(ExpectedConditions.invisibilityOfElementLocated(loadingImage)); 

    Em seguida, clique no elemento.

    Você também pode usar o clique do JavaScript e a rolagem não será necessária.

     IJavaScriptExecutor ex = (IJavaScriptExecutor)Driver; ex.ExecuteScript("arguments[0].click();", elementToClick); 

    Parece haver um bug no chromedriver para isso (o problema é que ele está marcado como não corrigirá) -> http://code.google.com/p/selenium/issues/detail?id=2766

    (coloque uma recompensa em FreedomSponsors talvez?)

    Há uma solução alternativa sugerida no comentário # 27. Talvez isso funcione para você.

    Eu tive o mesmo problema, tentei todas as soluções oferecidas, mas elas não funcionaram para mim. Eventualmente eu usei isso:

     JavascriptExecutor js = (JavascriptExecutor) driver; js.executeScript("var evt = document.createEvent('MouseEvents');" + "evt.initMouseEvent('click',true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0,null);" + "arguments[0].dispatchEvent(evt);", findElement(element)); 

    Espero que isto ajude

    Eu vi isso na situação quando a janela do Chrome dirigida por selenium foi aberta muito pequena. O elemento a ser clicado estava fora da viewport e, portanto, estava falhando.

    Isso parece lógico … o usuário real teria que resize a janela ou rolar para que seja possível ver o elemento e, de fato, clicar nele.

    Depois de instruir o driver de selenium para definir o tamanho da janela adequadamente, esses problemas foram embora para mim. A API do webdriver é descrita aqui .

    Uau, muitas respostas aqui e muitas boas.

    Espero acrescentar algo à minha experiência.

    Bom pessoal, no meu caso houve uma sobreposição de cookie escondendo o elemento ocasionalmente. Rolando para o elemento também funciona; mas na minha humilde opinião (no meu caso, não é uma panacéia para todos) a solução mais simples é ir em canvas cheia (eu estava rodando meus scripts em um 3/4 da janela da canvas)! Aqui vamos nos:

     driver.manage().window().maximize(); 

    Espero que ajude!

    Estava recebendo este erro ao executar testes sem cabeça com xvfb-run. Eles estavam trabalhando perfeitamente localmente. Usando chrome, versões do webdriver / chromedriver / chrome / java etc todas idênticas.

    O bug ‘não vai consertar’ no chromedriver – http://code.google.com/p/selenium/issues/detail?id=2766 apontado por Tony Lâmpada sugeriu que isso pode estar relacionado ao que é / não é visível na canvas.

    A mensagem de ajuda para o xvfb-run mostra o seguinte:

     -s ARGS --server-args=ARGS arguments (other than server number and "-nolisten tcp") to pass to the Xvfb server (default: "-screen 0 640x480x8") 

    Alterar a resolução do xvfb fez com que o erro desaparecesse:

     xvfb-run -s "-screen 0 1280x1024x16" ... 

    ruby / watir-webdriver / cromo

    Eu uso o seguinte truque e parece que funciona:

     #scroll to myelement @browser.execute_script "window.scrollTo(#{myelement.element.wd.location[0]},#{myelement.element.wd.location[1]})" # click myelement myelement.when_present.fire_event("click") 

    Eu também lutei com esse problema. Código funciona bem em FF, falha no Chrome. O que eu estava tentando fazer era clicar em uma checkbox de seleção – se não estivesse em exibição, eu rolaria para ver e depois clicar. Mesmo rolando para a vista funciona no Chrome, apenas os poucos pixels da checkbox de seleção não estavam visíveis, então o webdriver se recusou a clicar nela.

    Minha solução é esta:

     WebElement element = _sectorPopup.findElement(...); ((Locatable) element).getCoordinates().inViewPort(); try { element.click(); } catch (Exception e) { new Actions(getWebDriver()).sendKeys(Keys.PAGE_DOWN).perform(); element.click(); } 

    O Chrome também tem problemas com sendKeys. Por vezes, é necessário usar o Actions. Obviamente, você precisa saber qual direção e quanto você precisa ir para que sua milhagem possa variar. Mas eu prefiro isso ao hack do javascript, então estou postando aqui caso outra pessoa ache útil.

    Primeiro, tente obter o driver mais recente do Chrome e verifique se ele resolve o problema.

    No meu caso, isso não resolveu o problema. Mas a solução a seguir funcionou para mim até agora. O seguinte é o código C #, mas você pode seguir a mesma lógica em seu idioma específico. O que fazemos aqui é

    Etapa 1: concentre-se no elemento usando o object Ações do Selenium,

    Etapa 2: faça um clique no elemento

    Passo 3: Se houver uma exceção, então acionamos um evento “Click” de javascript no elemento, executando o script javascript através do método “ExecuteScript” do driver de navegador Selenium.

    Você também pode pular as etapas 1 e 2 e tentar apenas a etapa 3 também. O passo 3 funcionaria por conta própria, mas notei um comportamento estranho em um cenário no qual o passo 3, embora tenha clicado com êxito no elemento, causou um comportamento inesperado em outras partes do meu código depois de clicar no elemento.

      try { //Setup the driver and navigate to the web page... var driver = new ChromeDriver("folder path to the Chrome driver"); driver.Navigate().GoToUrl("UrlToThePage"); //Find the element... var element = driver.FindElement(By.Id("elementHtmlId")); //Step 1 new Actions(driver).MoveToElement(element).Perform(); //Step 2 element.Click(); } catch (Exception) { //Step 3 driver.ExecuteScript("document.getElementById('elementHtmlId').click();"); } 

    Ao usar o Transferidor, isso me ajudou:

     var elm = element(by.css('.your-css-class')); browser.executeScript("arguments[0].scrollIntoView();", elm.getWebElement()); elm.click(); 

    Eu estava enfrentando um problema semelhante whre eu tenho que verificar duas checkboxs de seleção um após o outro.Mas eu estava recebendo o mesmo acima erro.apenas eu adicionei esperar entre os meus passos para verificar as checkboxs de verificação …. está funcionando bem e ótimo. Aqui estão os passos:

      When I visit /administrator/user_profiles And I press xpath link "//*[@id='1']" Then I should see "Please wait for a moment..." When I wait for 5 seconds And I press xpath link "//*[@id='2']" Then I should see "Please wait for a moment..." When I visit /administrator/user_profiles_updates 

    Eu fiz esse método com base em um comentário da resposta de Tony Lâmpada. Funciona muito bem.

     def scroll_to(element) page.execute_script("window.scrollTo(#{element.native.location.x}, #{element.native.location.y})") end 

    Aparentemente, este é o resultado de um bug “Won’t Fix” no binário do driver do Chrome.

    Uma solução que funcionou para mim (Nossa milhagem pode variar) pode ser encontrada nesta discussão do Grupo do Google, Comentário nº 3:

    https://groups.google.com/forum/?fromgroups=#!topic/selenium-developer-activity/DsZ5wFN52tc

    A parte relevante está bem aqui:

    Desde então, tenho trabalhado em torno do problema, navegando diretamente para o href da âncora pai do span.

    driver.Navigate (). GoToUrl (driver.FindElement (Por.Id (embeddedSpanIdToClick)). FindElement (Por.XPath (“..”)). GetAttribute (“href”));

    No meu caso, eu estou usando Python, então quando eu tenho o elemento desejado, eu simplesmente uso

     driver.get(ViewElm.get_attribute('href')) 

    Eu esperaria que isso funcionasse, no entanto, se o elemento em que você está tentando clicar é um link …

    Eu estava enfrentando o mesmo problema com clj-webdriver (porta de clojure do Selenium). Acabei de traduzir a solução anterior para clojure por conveniência. Você pode chamar essa function antes de clicar ou o que for para evitar esse problema.

     (defn scrollTo "Scrolls to the position of the given css selector if found" [q] (if (exists? q) (let [ loc (location-once-visible q) jscript (str "window.scrollTo(" (:x loc) "," (:y loc) ")") ] (execute-script jscript)))) 

    Isso pode acontecer se o elemento mudar de posição enquanto o driver está tentando clicar nele (já vi isso com o IE também). O driver mantém a posição inicial, mas quando chega a clicar nele, essa posição não está mais apontando para esse elemento. O driver FireFox não tem esse problema BTW, aparentemente ele “clica” elementos programaticamente.

    De qualquer forma, isso pode acontecer quando você usa animações ou simplesmente altera a altura dos elementos dinamicamente (por exemplo, $("#foo").height(500) ). Você precisa ter certeza de que você só clicou em elementos depois que a altura deles foi “resolvida”. Acabei com o código que se parece com isso (ligações C #):

     if (!(driver is FirefoxDriver)) { new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until( d => d.FindElement(By.Id(someDynamicDiv)).Size.Height > initialSize); } 

    No caso de uma animação ou qualquer outro fator que você não pode facilmente consultar, você pode utilizar um método “genérico” que aguarda o elemento ser estacionário:

     var prevLocation = new Point(Int32.MinValue, Int32.MinValue); int stationaryCount = 0; int desiredStationarySamples = 6; //3 seconds in total since the default interval is 500ms return new WebDriverWait(driver, timeout).Until(d => { var e = driver.FindElement(By.Id(someId)); if (e.Location == prevLocation) { stationaryCount++; return stationaryCount == desiredStationarySamples; } prevLocation = e.Location; stationaryCount = 0; return false; }); 

    Eu conheci isso porque uma checkbox de diálogo de carregamento cobre esse elemento. Eu simplesmente resolvo isso adicionando uma espera antes de trabalhar com o elemento this.

     try { Thread.sleep((int) (3000)); } catch (InterruptedException e) { // e.printStackTrace(); } 

    Espero que esta ajuda!

    Eu estava recebendo o mesmo problema ao executar o script de selenium em python. Aqui está o que eu usei para clicar no elemento:

     from selenium.webdriver.common.action_chains import ActionChains ActionChains(driver).click(element).perform() 

    A resposta de Re Tony Lâmpada, comentário # 27 realmente resolveu o problema para mim, exceto que ele fornecia código Java e eu precisava do Python. Aqui está uma function Python que rola para a posição do elemento e, em seguida, clica nele.

     def scroll_to_and_click(xpath): element = TestUtil.driver.find_element_by_xpath(xpath) TestUtil.driver.execute_script('window.scrollTo(0, ' + str(element.location['y']) + ');') element.click() 

    Isso resolveu o problema para mim no Chrome 34.0. Não causou nenhum dano no Firefox 28.0 e no IE 11; Esses navegadores não estão sujeitos ao problema, mas a rolagem para a posição do elemento antes de clicar nele ainda não é uma coisa ruim.

    Talvez não seja uma solução realmente limpa, mas funciona:

     try: el.click() except WebDriverException as e: if 'Element is not clickable at point' in e.msg: self.browser.execute_script( '$("{sel}").click()'.format(sel=el_selector) ) else: raise 

    Eu estava recebendo esse bug porque testei um foco e, em seguida, precisei clicar no link abaixo da dica de ferramenta. A solução foi adicionar page.find('.sp-logo').hover antes de click_link para tirar a dica do caminho.

    Depois de testar todas as sugestões mencionadas, nada funcionou. Eu fiz esse código. Funciona, mas não é lindo

     public void click(WebElement element) { //https://code.google.com/p/selenium/issues/detail?id=2766 (fix) while(true){ try{ element.click(); break; }catch (Throwable e){ try { Thread.sleep(200); } catch (InterruptedException e1) { e1.printStackTrace(); } } } } public void click(String css) { //https://code.google.com/p/selenium/issues/detail?id=2766 (fix) while(true){ try{ driver.findElement(By.cssSelector(css)).click(); break; }catch (Throwable e){ try { Thread.sleep(200); } catch (InterruptedException e1) { e1.printStackTrace(); } } } } 

    Explicação da mensagem de erro :

    A mensagem de erro diz simplesmente que o elemento no qual você deseja clicar está presente, mas não está visível. Pode ser coberto por algo ou temporário não visível.

    Pode haver muitas razões pelas quais o elemento não é visível no momento do teste. Por favor, re-analisar sua página e encontrar a solução adequada para o seu caso.

    Solução para caso particular :

    No meu caso, esse erro ocorre quando uma dica de ferramenta do elemento de canvas em que eu acabei de clicar estava estourando sobre o elemento que eu queria clicar em seguida. Desfocagem foi uma solução que eu precisava.

    • Solução rápida como desfocar seria clicar para algum outro elemento em outra parte da canvas que não faz “nada” resp. nada acontece depois de uma ação de clique.
    • A solução adequada seria chamar element.blur() no elemento que aparece na dica de ferramenta, o que faria a dica de ferramenta desaparecer.

    Eu tive o mesmo problema e foi causado por um conflito de id entre o div e o link dentro do div. Então o motorista estava clicando no div em vez do link que eu queria. Eu mudei o id div e funcionou corretamente.

    Antes:

      

    Depois de:

      

    Eu corri para este problema e parece ser causado (no meu caso), clicando em um elemento que aparece uma div na frente do elemento clicado. Eu consegui contornar isso envolvendo meu clique em um grande bloco de captura de tentativa.

    No Drupal ao usar o selenium :

      // Get element. $element = $this->driver->getElement('xpath=//input'); // Get screen location. $location = $element->getLocation(); // To make sure that Chrome correctly handles clicking on the elements // outside of the screen, we must move the cursor to the element's location. $this->driver->moveCursor($location['x'], $location['y']); // Optionally, set some sleep time (0.5 sec in the example below) if your // elements are visible after some animation. time_nanosleep(0, 500000000); // Click on the element. $element->click(); 

    Eu tive o mesmo problema e recebi o erro ‘outro elemento receberia o clique’ de um elemento visível exibido. Não encontrei outra solução que acionasse o clique com um javascript.

    Eu substitui:

     WebElement el = webDriver.findElement(By.id("undo-alert")); WebElement closeButton = el.findElement(By.className("close")); // The following throws 'Element is not clickable at point ... Other element // would receive the click' closeButton.click(); 

    com:

     ((JavascriptExecutor) webDriver).executeScript( "$('#undo-alert').find('.close').click();" ); 

    e tudo funcionou bem

    Eu tive o mesmo problema e passei horas encontrando a solução. Eu tentei clicar em uma célula na parte inferior de um ngGrid longo usando transferidor. Aqui está um instantâneo do meu ngGrid html:

     ....many rows here.. < !- row in renderedRows -> < !- column in renderedColumns ->  

    toda a function de clique não funcionou. A solução é usar avaliar no escopo atual do elemento:

     element(by.cssContainingText("a", "the test link 100000")) .evaluate("selectRow(row)") 

    Eu tinha outro bug em que o find_link no Chrome e o Poltergeist não podiam clicar em uma tag A com uma tag EM e algum texto dentro dela, embora funcionasse bem no Firefox e no rack_test. A solução foi replace click_link(link) por:

     find('a em', text: link).click 

    No Visual Studio 2013, se você habilitar o BrowserLink, ele exibe uma barra de navegação do BrowserLink na parte inferior da canvas. Se o item que você deseja clicar estiver atrás da barra de navegação, ele fornecerá o erro. Desativar o BrowserLink resolveu o problema para mim.