Selenium Web Driver e Java. L'elemento non è selezionabile nel punto (x, y). Un altro elemento riceverebbe il clic


92

Ho usato attese esplicite e ho l'avviso:

org.openqa.selenium.WebDriverException: l'elemento non è selezionabile nel punto (36, 72). Un altro elemento riceverebbe il clic: ... Durata o timeout del comando: 393 millisecondi

Se lo utilizzo Thread.sleep(2000)non ricevo nessun avviso.

@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);
}

Utilizzi la versione 61 o successiva di Chrome?
demouser123

@ demouser123 sto usando Firefox 47.0.1 e seleniumWebDriver 2.51.0
Maria

@Maria Su quale riga stai ricevendo l'errore? Grazie
DebanjanB

@DebanjanB In linea: driver.findElement (By.id ("navigationPageButton")). Click ();
Maria

Questo errore significa che c'è un altro elemento che si sovrappone all'elemento di destinazione (overlay posizionato fisso / assoluto) o che lo z-index è troppo basso. Ciò potrebbe essere causato da effetti al passaggio del mouse che utilizzano transizioni (più lenti del timeout minimo, in questo caso 393 ms). dovresti aspettare #navigationPageButtonche diventi visibile (o cliccabile anche elementToBeClickable()per quell'elemento) o controllare se tutte le precondizioni sono soddisfatte in modo che il pulsante sia cliccabile.
prova a catturare finalmente il

Risposte:


194

WebDriverException: l'elemento non è selezionabile nel punto (x, y)

Questa è una tipica org.openqa.selenium.WebDriverException che estende java.lang.RuntimeException .

I campi di questa eccezione sono:

  • 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

Riguardo al tuo caso d'uso individuale, l'errore dice tutto:

WebDriverException: Element is not clickable at point (x, y). Other element would receive the click 

È chiaro dal blocco di codice che hai definito waitas WebDriverWait wait = new WebDriverWait(driver, 10);ma stai chiamando il click()metodo sull'elemento prima che ExplicitWaitentri in gioco come in until(ExpectedConditions.elementToBeClickable).

Soluzione

L'errore Element is not clickable at point (x, y)può derivare da diversi fattori. Puoi risolverli con una delle seguenti procedure:

1. L'elemento non viene cliccato a causa della presenza di chiamate JavaScript o AJAX

Prova a usare ActionsClass:

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

2. L'elemento non viene cliccato perché non è all'interno di Viewport

Prova a utilizzare JavascriptExecutorper portare l'elemento all'interno del Viewport:

WebElement myelement = driver.findElement(By.id("navigationPageButton"));
JavascriptExecutor jse2 = (JavascriptExecutor)driver;
jse2.executeScript("arguments[0].scrollIntoView()", myelement); 

3. La pagina viene aggiornata prima che l'elemento sia selezionabile.

In questo caso indurre ExplicitWait ovvero WebDriverWait come indicato al punto 4.

4. L'elemento è presente nel DOM ma non è cliccabile.

In questo caso indurre ExplicitWait con ExpectedConditionsimpostato su elementToBeClickableaffinché l'elemento sia cliccabile:

WebDriverWait wait2 = new WebDriverWait(driver, 10);
wait2.until(ExpectedConditions.elementToBeClickable(By.id("navigationPageButton")));

5. L'elemento è presente ma ha una sovrapposizione temporanea.

In questo caso, indurre ExplicitWaitcon ExpectedConditionsimpostato su invisibilityOfElementLocatedaffinché la sovrapposizione sia invisibile.

WebDriverWait wait3 = new WebDriverWait(driver, 10);
wait3.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("ele_to_inv")));

6. L'elemento è presente ma ha una sovrapposizione permanente.

Utilizzare JavascriptExecutorper inviare il clic direttamente sull'elemento.

WebElement ele = driver.findElement(By.xpath("element_xpath"));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", ele);

1
A # 6 / # 2 sopra: il metodo .ExecuteScript è ora accessibile dal driver web stesso piuttosto che da JavascriptExecutor. Grazie per la risposta ben scritta!
Tabrock

6
Hai coperto molte possibilità in cui solo 5 e 6 sono il modo corretto per gestire l'errore menzionato. I primi quattro generano errori diversi per i quali la soluzione che hai fornito non funzionerà. Per un esempio, il punto numero 3 è in realtà un problema di elementi obsoleti che non funzionerebbe anche se per quanto tempo aspetti con il metodo elementToBeClickble. Questo deve essere gestito in modo diverso.
Rajagopalan

6 non è proprio corretto; un trucco per aggirare il problema, 5 sarebbe corretto se fosse stata utilizzata la condizione prevista corretta. 4 sembra l'unica risposta corretta.
Ardesco

1
Una cosa importante da notare è che, quando emuliamo le azioni dell'utente, potrebbe essere molto indesiderabile usare javascript per fare clic su un elemento che non può essere cliccato affatto (# 6). L'utente finale non lo farebbe mai, si limita a scorrere fino all'elemento per portarlo nella visualizzazione o a eliminare qualsiasi overlay (se consentito dalla pagina) per interagire con esso.
p_champ

18

Nel caso in cui sia necessario utilizzarlo con Javascript

Possiamo usare gli argomenti [0] .click () per simulare l'operazione di clic.

var element = element(by.linkText('webdriverjs'));
browser.executeScript("arguments[0].click()",element);

Lavori! Non riesco a immaginare come funzioni, ma per il resto fa clic sul livello di sovrapposizione (l'attesa della chiusura della sovrapposizione con "invisibilityOfElementLocated" richiede circa 30 secondi).
Fisk

Puoi per favore scrivere la spiegazione completa dato che scrivo in Java e non è una guerra familiare, puoi per favore fornire il flusso completo?
Bastian

4

Mi sono imbattuto in questo errore mentre cercavo di fare clic su un elemento (o sulla sua sovrapposizione, non mi importava) e le altre risposte non hanno funzionato per me. L'ho risolto utilizzando l' elementFromPointAPI DOM per trovare l'elemento su cui Selenium voleva che facessi clic:

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()

Ho anche avuto situazioni in cui un elemento si muoveva , ad esempio perché un elemento sopra di esso nella pagina stava eseguendo un'espansione o una compressione animata. In quel caso, questa classe Condizione attesa ha aiutato. Gli dai gli elementi che sono animati , non quelli su cui vuoi fare clic. Questa versione funziona solo per le animazioni 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

2

Puoi provare

WebElement navigationPageButton = (new WebDriverWait(driver, 10))
 .until(ExpectedConditions.presenceOfElementLocated(By.id("navigationPageButton")));
navigationPageButton.click();

Non mi aiuta.
Maria

Sì: org.openqa.selenium.WebDriverException: l'elemento non è selezionabile nel punto (36, 72). Un altro elemento riceverebbe il clic: <div tabindex = "0" class = "waiter-ui-lock"> </div> Durata o timeout del comando: 70 millisecondi
Maria

1
prova quanto segueWebElement element = driver.findElement(By.id("navigationPageButton")); Actions actions = new Actions(driver); actions.moveToElement(element).click().perform();
fg78nc

Non è neanche d'aiuto. Ho due Exception e un AssertionError e poi qualche errore "L'elemento non è selezionabile nel punto"
Maria

1
Se uso Thread.Sleep allora tutto funziona. Ma sto usando Wait all fail.
Maria

2

Scorrere la pagina fino al punto vicino menzionato nell'eccezione ha fatto il trucco per me. Di seguito è riportato lo snippet di codice:

$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: utilizzo il webdriver php di Facebook


0

La soluzione migliore è ignorare la funzionalità di 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;
        }
    }
}

0

In C #, ho avuto problemi con il controllo RadioButtone questo ha funzionato per me:

driver.ExecuteJavaScript("arguments[0].checked=true", radio);

0

Può provare con il codice sottostante

 WebDriverWait wait = new WebDriverWait(driver, 30);

Passa altro elemento riceverà il clic :<a class="navbar-brand" href="#"></a>

    boolean invisiable = wait.until(ExpectedConditions
            .invisibilityOfElementLocated(By.xpath("//div[@class='navbar-brand']")));

Passa l'ID pulsante cliccabile come mostrato di seguito

    if (invisiable) {
        WebElement ele = driver.findElement(By.xpath("//div[@id='button']");
        ele.click();
    }

0

Se l'elemento non è selezionabile e si verifica un problema di sovrapposizione, utilizziamo gli argomenti [0] .click ().

WebElement ele = driver.findElement (By.xpath ("// div [@ class = 'input-group-btn'] / input")); JavascriptExecutor executor = (JavascriptExecutor) driver; executor.executeScript ("argomenti [0] .click ();", ele);

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.