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). L'autre élément recevrait le clic: ... Durée ou délai de la commande: 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);
}
#navigationPageButton
devenir visible (ou cliquerelementToBeClickable()
sur cet élément également) ou vérifier si toutes les conditions préalables sont remplies pour que le bouton soit cliquable.Réponses:
WebDriverException: l'élément n'est pas cliquable au point (x, y)
Il s'agit d'une org.openqa.selenium.WebDriverException typique qui étend 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 est clair d'après votre bloc de code que vous avez défini le
wait
asWebDriverWait wait = new WebDriverWait(driver, 10);
mais que vous appelez laclick()
méthode sur l'élément avant que leExplicitWait
n'entre en jeu comme dansuntil(ExpectedConditions.elementToBeClickable)
.Solution
L'erreur
Element is not clickable at point (x, y)
peut provenir de différents facteurs. Vous pouvez y remédier par l'une des procédures suivantes:1. L'élément n'est pas cliqué en raison d'appels JavaScript ou AJAX présents
Essayez d'utiliser la
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 n'est pas dans la fenêtre
Essayez d'utiliser
JavascriptExecutor
pour amener l'élément dans la fenêtre:WebElement myelement = driver.findElement(By.id("navigationPageButton")); JavascriptExecutor jse2 = (JavascriptExecutor)driver; jse2.executeScript("arguments[0].scrollIntoView()", myelement);
3. La page est actualisée avant que l'élément ne soit cliquable.
Dans ce cas, indiquez ExplicitWait, c'est-à-dire WebDriverWait, comme mentionné au point 4.
4. L'élément est présent dans le DOM mais non cliquable.
Dans ce cas, induisez ExplicitWait avec
ExpectedConditions
la valeur deelementToBeClickable
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
avecExpectedConditions
set toinvisibilityOfElementLocated
pour que la superposition soit invisible.WebDriverWait wait3 = new WebDriverWait(driver, 10); wait3.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("ele_to_inv")));
6. L'élément est présent mais ayant 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);
la source
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);
la source
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'
elementFromPoint
API DOM pour trouver l'élément sur lequel Selenium voulait que je clique à la place: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 eu des situations où un élément se déplaçait , par exemple parce qu'un élément au-dessus de lui sur la page effectuait un développement ou un repli animé animé. Dans ce cas, cette classe de condition attendue a aidé. Vous lui donnez les éléments qui sont 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
la source
Tu peux essayer
WebElement navigationPageButton = (new WebDriverWait(driver, 10)) .until(ExpectedConditions.presenceOfElementLocated(By.id("navigationPageButton"))); navigationPageButton.click();
la source
WebElement element = driver.findElement(By.id("navigationPageButton")); Actions actions = new Actions(driver); actions.moveToElement(element).click().perform();
Faire défiler la page jusqu'au point proche mentionné dans l'exception a fait l'affaire pour moi. Voici un 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);");
REMARQUE: j'utilise Facebook php webdriver
la source
La meilleure solution consiste à remplacer la fonctionnalité de clic:
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; } } }
la source
En C #, j'ai eu des problèmes de vérification
RadioButton
, et cela a fonctionné pour moi:driver.ExecuteJavaScript("arguments[0].checked=true", radio);
la source
Peut essayer avec le code ci-dessous
WebDriverWait wait = new WebDriverWait(driver, 30);
Passer un autre élément recevrait le clic :
<a class="navbar-brand" href="#"></a>
boolean invisiable = wait.until(ExpectedConditions .invisibilityOfElementLocated(By.xpath("//div[@class='navbar-brand']")));
Passez l'identifiant du bouton cliquable comme indiqué ci-dessous
if (invisiable) { WebElement ele = driver.findElement(By.xpath("//div[@id='button']"); ele.click(); }
la source