478 Stimmen

Fehlersuche bei "Element ist an Punkt nicht klickbar"

Ich sehe dies nur in Chrome.

Die vollständige Fehlermeldung lautet:

"org.openqa.selenium.WebDriverException: Element ist an Punkt (411, 675) nicht anklickbar. Ein anderes Element würde den Klick erhalten: ..."

Das Element, das "angeklickt" werden würde, befindet sich neben dem fraglichen Element, nicht darüber und nicht überlappend, und es bewegt sich nicht auf der Seite.

Ich habe versucht, einen Versatz hinzuzufügen, aber auch das funktioniert nicht. Das Element befindet sich im angezeigten Fenster, ohne dass ein Bildlauf erforderlich ist.

4voto

sri Punkte 681

Der Grund für diese Fehlermeldung ist, dass sich das Element, auf das Sie klicken wollen, nicht im Viewport (Bereich, den der Benutzer sieht) des Browsers befindet. Sie können dieses Problem also umgehen, indem Sie zuerst zu dem gewünschten Element scrollen und dann klicken.

Javascript:

async scrollTo (webElement) {
    await this.driver.executeScript('arguments[0].scrollIntoView(true)', webElement)
    await this.driver.executeScript('window.scrollBy(0,-150)')
}

Java:

public void scrollTo (WebElement e) {
    JavascriptExecutor js = (JavascriptExecutor) driver; 
    js.executeAsyncScript('arguments[0].scrollIntoView(true)', e)
    js.executeAsyncScript('window.scrollBy(0,-150)')
}

3voto

Ohad Schneider Punkte 34748

Dies kann passieren, wenn das Element seine Position ändert, während der Treiber versucht, darauf zu klicken (ich habe dies auch beim IE beobachtet). Der Treiber behält die ursprüngliche Position bei, aber wenn er tatsächlich auf das Element klickt, zeigt diese Position nicht mehr auf das Element. Der FireFox-Treiber hat dieses Problem übrigens nicht, offenbar "klickt" er Elemente programmatisch an.

Jedenfalls kann dies passieren, wenn Sie Animationen verwenden oder einfach die Höhe von Elementen dynamisch ändern (z. B. $("#foo").height(500) ). Sie müssen sicherstellen, dass Sie nur Elemente klicken, nachdem sich ihre Höhe "eingependelt" hat. Ich endete mit Code, der wie folgt aussieht (C# Bindungen):

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

Im Falle einer Animation oder eines anderen Faktors, den Sie nicht einfach abfragen können, können Sie eine "generische" Methode verwenden, die darauf wartet, dass das Element stationär ist:

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

3voto

Zags Punkte 30855

Wenn Sie eine jQuery auf der Seite geladen ist, können Sie den folgenden Javascript-Befehl ausführen:

"$('#" + element_id + "').click()"

Beispiel mit Python-Executor:

driver.execute_script("$('#%s').click()" % element_id)

3voto

Dee Punkte 282

Erläuterung der Fehlermeldung :

Die Fehlermeldung besagt lediglich, dass das Element, auf das Sie klicken möchten, zwar vorhanden, aber nicht sichtbar ist. Es könnte durch etwas verdeckt oder vorübergehend nicht sichtbar sein.

Es kann viele Gründe geben, warum das Element zum Zeitpunkt der Prüfung nicht sichtbar ist. Bitte analysieren Sie Ihre Seite erneut und finden Sie eine geeignete Lösung für Ihren Fall.

Lösung für besonderen Fall :

In meinem Fall tritt dieser Fehler auf, wenn ein Tooltip des Bildschirmelements, auf das ich gerade geklickt habe, über dem Element auftaucht, auf das ich als nächstes klicken wollte. Defokussieren war eine Lösung, die ich brauchte.

  • Schnelle Lösung wie man defokussieren kann, wäre, auf ein anderes Element in einem anderen Teil des Bildschirms zu klicken, das "nichts" tut bzw. nichts passiert nach einer Klickaktion.
  • Die richtige Lösung wäre der Aufruf element.blur() auf dem Element, das die QuickInfo ausklappt, was dazu führen würde, dass die QuickInfo verschwindet.

3voto

Huy Hóm Hỉnh Punkte 579

Ich habe sie getroffen, weil

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

H

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X