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). Un autre élément recevrait le clic: ... Durée de la commande ou délai d'attente: 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);
}
Il s’agit d’une exception org.openqa.Selenium.WebDriverException qui s’étend à une exception Java.lang.RuntimeException .
Les champs de cette exception sont:
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
À 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 ressort clairement de votre bloc de code que vous avez défini wait
comme WebDriverWait wait = new WebDriverWait(driver, 10);
mais que vous appelez la méthode click()
sur l'élément avant que ExplicitWait
entre en jeu comme dans until(ExpectedConditions.elementToBeClickable)
.
L'erreur Element is not clickable at point (x, y)
peut provenir de différents facteurs. Vous pouvez les résoudre en utilisant l’une des procédures suivantes:
1. L'élément n'a pas été cliqué à cause de JavaScript ou de AJAX appels présents
Essayez d'utiliser Actions
Classe:
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 ne se trouve pas dans Viewport
Essayez d'utiliser JavascriptExecutor
pour amener l'élément dans la fenêtre de visualisation:
WebElement myelement = driver.findElement(By.id("navigationPageButton"));
JavascriptExecutor jse2 = (JavascriptExecutor)driver;
jse2.executeScript("arguments[0].scrollIntoView()", myelement);
3. La page est en cours de rafraîchissement avant que l'élément ne puisse être cliqué.
Dans ce cas, indiquez ExplicitWait i.e WebDriverWait comme indiqué au point 4.
4. L'élément est présent dans le DOM mais n'est pas cliquable.
Dans ce cas, indiquez ExplicitWait avec ExpectedConditions
défini sur elementToBeClickable
pour 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 ExplicitWait
avec ExpectedConditions
défini sur invisibilityOfElementLocated
pour la superposition sur Être invisible.
WebDriverWait wait3 = new WebDriverWait(driver, 10);
wait3.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("ele_to_inv")));
6. L'élément est présent mais il a une superposition permanente.
Utilisez JavascriptExecutor
pour 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);
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);
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'API elementFromPoint
DOM pour trouver l'élément sur lequel Selenium voulait que je clique:
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 rencontré des situations où un élément était en mouvement, par exemple parce qu'un élément situé au-dessus de celui-ci sur la page effectuait un développement ou un repli animé. Dans ce cas, cette classe de condition attendue a aidé. Vous lui donnez le éléments 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
Faire défiler la page jusqu'au point proche mentionné dans l'exception a fait l'affaire pour moi. Ci-dessous l'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);");
NOTE: j'utilise pilote Facebook php
Tu peux essayer
WebElement navigationPageButton = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(By.id("navigationPageButton")));
navigationPageButton.click();