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);
}
#navigationPageButton
se tornar visível (ou clicável usandoelementToBeClickable()
para esse elemento também) ou verificar se todas as pré-condições foram atendidas para que o botão seja clicável.Respostas:
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:
protected static final java.lang.String BASE_SUPPORT_URL
public static final java.lang.String DRIVER_INFO
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
wait
como,WebDriverWait wait = new WebDriverWait(driver, 10);
mas está chamando oclick()
método no elemento antes deExplicitWait
entrar em jogo como emuntil(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
Actions
classe: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
JavascriptExecutor
para 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
ExpectedConditions
definido comoelementToBeClickable
para 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
ExplicitWait
comExpectedConditions
definido comoinvisibilityOfElementLocated
para 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
JavascriptExecutor
para enviar o clique diretamente no elemento.WebElement ele = driver.findElement(By.xpath("element_xpath")); JavascriptExecutor executor = (JavascriptExecutor)driver; executor.executeScript("arguments[0].click();", ele);
fonte
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);
fonte
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
elementFromPoint
API 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
fonte
Podes tentar
WebElement navigationPageButton = (new WebDriverWait(driver, 10)) .until(ExpectedConditions.presenceOfElementLocated(By.id("navigationPageButton"))); navigationPageButton.click();
fonte
WebElement element = driver.findElement(By.id("navigationPageButton")); Actions actions = new Actions(driver); actions.moveToElement(element).click().perform();
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
fonte
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; } } }
fonte
Em C #, tive problemas com a verificação
RadioButton
e funcionou para mim:driver.ExecuteJavaScript("arguments[0].checked=true", radio);
fonte
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(); }
fonte
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);
fonte