Fehler beim Debuggen des Fehlers "Element ist zum Zeitpunkt nicht anklickbar"

396

Ich sehe das nur in Chrome.

Die vollständige Fehlermeldung lautet:

"org.openqa.selenium.WebDriverException: Element kann an Punkt (411, 675) nicht angeklickt werden. Anderes Element würde den Klick erhalten: ..."

Das Element, das den Klick erhalten würde, befindet sich neben dem betreffenden Element, nicht darüber und überlappt es nicht und bewegt sich nicht auf der Seite.

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

user1591169
quelle
2
Warten Sie, bis die Seite geladen ist? Vielleicht überlappen andere Elemente es, während die Seite geladen wird?
Herokiller
55
Lange Rede, kurzer Sinn für diejenigen, die gerade ankommen - DAS ELEMENT IST AUF DER SEITE NICHT SICHTBAR UND DAHER NICHT KLICKBAR. SIE MÜSSEN DEN VIEWPORT DURCH EMITTING window.ScrollTo scrollen.
Chris B. Behrens
67
@ ChrisB.Behrens Das ist nicht immer der Fall. Dieser bestimmte Fehler kann auch angegeben werden, wenn ein Element von einem anderen abgedeckt wird. Ich hatte diese Ausnahme, als ich versuchte, auf eine Schaltfläche zu klicken, die ein anderes Element mit fester Position war.
Martin Cassidy
4
Es ist nicht nur Chromedriver - hatte das gleiche Problem mit Firefox. Ich habe das Problem behoben, indem ich eine Verzögerung implementiert habe, um zu warten, bis die Seite vollständig neu geladen wurde, wie von anderen oben vorgeschlagen.
Codervince
5
Ich denke, dies ist ein absolut falscher Rat, scrollTo zu senden oder Wartezeiten zu machen. Es sieht so aus, als ob der Algorithmus für das Klicken mit Selen wie folgt lautet: 1. Elementposition berechnen 2. Zu dieser Position scrollen (damit Sie sie nicht selbst ausgeben müssen) 3. Auf diese Position klicken (Ausnahme ergibt sich aus der letzten Behauptung, die prüft, welches Element darauf steht Position kurz vor dem eigentlichen Senden des Klickereignisses) Meine Ratschläge lauten: 1. Überprüfen Sie, ob sich das Element in Ihrem Ansichtsfenster befindet. 2. Überprüfen Sie, ob das Element von einem anderen Element abgedeckt wird (z. B. klebrige Menüs), blenden Sie es aus, falls vorhanden, oder scrollen Sie manuell, bevor Sie auf klicken, ohne sich auf das integrierte scrollTo zu verlassen.
Vitalik Verhovodov

Antworten:

325

Dies wird durch folgende 3 Typen verursacht:

1.Das Element ist zum Klicken nicht sichtbar.

Verwenden Aktionen oder JavascriptExecutor, um zum Klicken zu gelangen.

Durch Aktionen:

WebElement element = driver.findElement(By("element_path"));

Actions actions = new Actions(driver);

actions.moveToElement(element).click().perform();

Von JavascriptExecutor:

JavascriptExecutor jse = (JavascriptExecutor)driver;

jse.executeScript("scroll(250, 0)"); // if the element is on top.

jse.executeScript("scroll(0, 250)"); // if the element is on bottom.

oder

JavascriptExecutor jse = (JavascriptExecutor)driver;

jse.executeScript("arguments[0].scrollIntoView()", Webelement); 

Klicken Sie dann auf das Element.

2.Die Seite wird aktualisiert, bevor auf das Element geklickt wird.

Lassen Sie die Seite dazu einige Sekunden warten.

3. Das Element ist anklickbar, aber darüber befindet sich ein Drehfeld / Overlay

Der folgende Code wartet, bis die Überlagerung angezeigt wird

By loadingImage = By.id("loading image ID");

WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds);

wait.until(ExpectedConditions.invisibilityOfElementLocated(loadingImage));

Klicken Sie dann auf das Element.

Prabu Ananthakrishnan
quelle
52
Es gibt eine dritte Art von Ursache, nämlich dass Ihr Element in ein Div oder eine Spanne eingeschlossen ist. Die Seite kann vollständig geladen werden und sich vollständig im Ansichtsfenster befinden. Chromedriver weigert sich jedoch, darauf zu klicken, wenn der Web-Treiber für FF und IE keine Probleme aufweist. Ein echter Mensch hat keine Ahnung, dass die Spanne existiert, und dem Browser ist es egal, wann Sie als Mensch tatsächlich darauf klicken. Weder das Bewegen noch das Warten lösen dieses Problem. Vermeiden Sie entweder Chrome / Chromedriver oder schreiben Sie den HTML-Code der Seite neu. Dies scheint die einzige Option für Personen in Fall 3 zu sein.
Don Simon
54
@ DonSimon Ich hatte das gleiche Problem wie du. Ich konnte es umgehen, indem ich .SendKeys (Keys.Return) anstelle von .Click verwendete. Dies funktionierte für mich in Chrome, wo ich dieses Problem hatte, und in Firefox, wo ich ein anderes ähnliches Problem mit diesem bestimmten Link hatte (Anker in einem Div).
Peter Bernier
17
Die von @PeterBernier vorgeschlagene Lösung funktioniert gut, wenn das Element in ein div oder einen span eingeschlossen ist. In Python habe ich .send_keys ('\ n') verwendet, um den Klick zu simulieren und das Problem in Chrome zu umgehen.
GJ
4
Wenn ein Element von einem div-Element ausgeblendet wird, wird es durch den folgenden Code behoben. executeJavascript ("Argumente [0] .click ();", selenium.findElement (locator));
EsotericNonsense
Sie können auch warten, bis das Element anklickbar ist. wait.Until (ExpectedConditions.ElementToBeClickable (webElement));
Chielus
67

Sie können auch JavaScript-Klicks verwenden, und ein Scrollen wäre dann nicht erforderlich.

IJavaScriptExecutor ex = (IJavaScriptExecutor)Driver;
ex.ExecuteScript("arguments[0].click();", elementToClick);
Bart Wojtala
quelle
5
Nicht zu fassen! Ich frage mich, warum Selen die von ihnen bereitgestellte click () -Methode nicht in den Papierkorb wirft, da es Bedingungen gibt, unter denen isDisplayed () und isEnabled () nicht ausreichen, um auf ein Element zu klicken, und dies scheint die einzige Lösung zu sein. Vielen Dank!
Giovanni Bitliner
2
+1: Dies ist die Lösung, die für mich funktioniert hat. actions.MoveToElementfunktionierte in C # nicht für mich und die anderen Bildlauflösungen schienen insofern etwas fragil zu sein, als die Möglichkeit bestand, dass das Bildlauf das Element nicht richtig in Sicht brachte oder sich die Position des Elements auf der Seite ändern konnte.
Benutzer
1
Diese Lösung ist die einfachste, wenn das Element nicht
angezeigt wird
@Giovanni Bitliner Diese Methode wird nicht angeboten, da es sich nicht um ein echtes Benutzerszenario handelt. Benutzer sollten auch warten müssen, bis der Lader verschwindet. Ich denke, das ist eine wunderbare Sache über Selen.
Gideon Mulder
+1 Hat auch bei mir funktioniert. Ich habe gerade eine flwg-Methode zu meinem Code hinzugefügt: `private void jsClick (IWebElement-Element, IWebDriver-Treiber) {IJavaScriptExecutor ex = (IJavaScriptExecutor) Treiber; ex.ExecuteScript ("Argumente [0] .click ();", Element); } `Auf diese Weise aufgerufen: 'jsClick (driver.FindElement (By.XPath (" xpathOfTheElement "))); `
Jeremias
46

Es scheint einen Fehler in chromedriver zu geben (das Problem ist, dass es als nicht behebbar markiert ist) -> GitHub Link

( Setzen Sie ein Kopfgeld auf FreedomSponsors Vielleicht ?)

In Kommentar Nr. 27 wird eine Problemumgehung vorgeschlagen. Vielleicht funktioniert es für Sie-

Tony Lâmpada
quelle
4
Scheint fair - wenn die Schaltfläche nicht auf dem Bildschirm angezeigt wird, kann sie nicht wirklich angeklickt werden.
Evan Knowles
Dies ist kein Fehler. Dies ist beabsichtigtes Verhalten und es ist richtig. Wenn sich ein Element außerhalb des Ansichtsfensters befindet, müssen Sie wie vorgeschlagen einen Bildlauf durchführen.
Alex Skrypnyk
Ich habe Firefox ausprobiert und festgestellt, dass es diesen Fehler nicht gab, aber der Klick wurde trotzdem ignoriert. Es stellte sich heraus, dass ein Eltern-Div eine Höhe von Null hatte. Sobald das behoben war, funktionierten beide gut.
Dansalmo
35

Ich hatte das gleiche Problem, habe alle angebotenen Lösungen ausprobiert, aber sie haben bei mir nicht funktioniert. Schließlich habe ich dies verwendet:

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("var evt = document.createEvent('MouseEvents');" + "evt.initMouseEvent('click',true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0,null);" + "arguments[0].dispatchEvent(evt);", findElement(element));

Hoffe das hilft

XGillerX
quelle
16

Ich habe dies in der Situation gesehen, als das selengetriebene Chrome-Fenster zu klein geöffnet wurde. Das Element, auf das geklickt werden soll, befand sich außerhalb des Ansichtsfensters und schlug daher fehl.

Das klingt logisch ... ein echter Benutzer müsste entweder die Größe des Fensters ändern oder einen Bildlauf durchführen, damit das Element angezeigt und tatsächlich darauf geklickt werden kann.

Nachdem ich den Selentreiber angewiesen hatte, die Fenstergröße entsprechend einzustellen, verschwand dieses Problem für mich. Die Webdriver-API wird hier beschrieben .

opichals
quelle
15

Wow, viele Antworten hier und viele gute.

Ich hoffe, ich werde aus meiner Erfahrung etwas hinzufügen.

Nun Leute, in meinem Fall gab es gelegentlich eine Cookie-Überlagerung, die das Element verbarg. Das Scrollen zum Element funktioniert auch. Aber meiner bescheidenen Meinung nach (für meinen Fall kein Allheilmittel für alle) ist die einfachste Lösung, einfach im Vollbildmodus zu arbeiten (ich habe meine Skripte auf einem 3/4 des Bildschirmfensters ausgeführt)! Auf geht's:

driver.manage().window().maximize();

Ich hoffe, das hilft!

Xwris Stoixeia
quelle
13

Ruby / Watir-Webdriver / Chrom

Ich benutze den folgenden Trick und scheint zu funktionieren:

#scroll to myelement
@browser.execute_script "window.scrollTo(#{myelement.element.wd.location[0]},#{myelement.element.wd.location[1]})"

# click myelement
myelement.when_present.fire_event("click")
Annet
quelle
1
Das Problem, das ich sah, war mit einer Gebietskarte. Der Fehler war der gleiche wie beim ursprünglichen Beitrag hier - ein Div "vor" dem Bereich, auf den ich klicken musste. Es war kein AJAX- / Timing- / Seitenladeproblem, und der Bereich war in voller Ansicht - ich konnte nicht einmal scrollen, um mich darauf zu konzentrieren. Das Ändern meiner Klickmethode von object.click in object.fire_event ("click") scheint das Problem für mich jedoch behoben zu haben. Ich habe es in einem Start- / Rettungsblock belassen, damit es möglicherweise keinen Einfluss darauf hat, wie Firefox normal klickt.
Adam Reed
Dieser Ansatz hat das Problem für mich umgangen, als Elemente im Ansichtsfenster nicht sichtbar waren.
Jason R. Coombs
13

Auch ich habe mit diesem Problem gerungen. Code funktioniert gut in FF, schlägt in Chrome fehl. Ich habe versucht, auf ein Kontrollkästchen zu klicken. Wenn es nicht angezeigt wird, würde ich zum Anzeigen scrollen und dann klicken. Selbst das Scrollen in die Ansicht funktioniert in Chrome. Nur die unteren Pixel des Kontrollkästchens waren nicht sichtbar, sodass der Webdriver sich weigerte, darauf zu klicken.

Meine Problemumgehung ist folgende:

WebElement element = _sectorPopup.findElement(...);

((Locatable) element).getCoordinates().inViewPort();
try {
    element.click();
} catch (Exception e) {
    new Actions(getWebDriver()).sendKeys(Keys.PAGE_DOWN).perform();
    element.click();
}

Chrome hat auch Probleme mit sendKeys. Manchmal ist die Verwendung von Aktionen erforderlich. Natürlich müssen Sie wissen, in welche Richtung und wie viel Sie fahren müssen, damit Ihr Kilometerstand variieren kann. Aber ich ziehe dies dem Javascript-Hack vor, deshalb poste ich es hier, falls jemand anderes es nützlich findet.

Kolibri
quelle
Locatable ist veraltet.
Steve Staple
12

Ich habe diesen Fehler erhalten, als ich Tests ohne Kopf mit xvfb-run ausgeführt habe. Sie arbeiteten einwandfrei vor Ort. Unter Verwendung von Chrome sind alle Versionen von Webdriver / Chromedriver / Chrome / Java usw. identisch.

Der Fehler "wird nicht behoben" in chromedriver - GitHub Link , auf den Tony Lâmpada hingewiesen hat, schlug vor, dass dies möglicherweise mit dem zusammenhängt, was auf dem Bildschirm angezeigt wird / nicht.

Die Hilfemeldung für xvfb-run zeigt Folgendes:

-s ARGS   --server-args=ARGS    arguments (other than server number and
                                "-nolisten tcp") to pass to the Xvfb server
                                (default: "-screen 0 640x480x8")

Durch Ändern der Auflösung für xvfb wurde der Fehler behoben:

xvfb-run -s "-screen 0 1280x1024x16" ...
U-Phoria
quelle
9

Bei der Verwendung von Winkelmesser hat mir dies geholfen:

var elm = element(by.css('.your-css-class'));
browser.executeScript("arguments[0].scrollIntoView();", elm.getWebElement());
elm.click();
Gal Bracha
quelle
8

Versuchen Sie zunächst, den neuesten Chrome-Treiber abzurufen, und überprüfen Sie, ob das Problem dadurch behoben wird.

In meinem Fall wurde das Problem nicht behoben. Die folgende Lösung hat bisher bei mir funktioniert. Das Folgende ist C # -Code, aber Sie können dieselbe Logik in Ihrer spezifischen Sprache befolgen. Was wir hier tun ist,

Schritt 1: Konzentrieren Sie sich mit dem Objekt Selenium Actions auf das Element.

Schritt 2: Klicken Sie dann auf das Element

Schritt 3: Wenn es eine Ausnahme gibt, lösen wir ein Javascript "Click" -Ereignis für das Element aus, indem wir das Javascript-Skript über die "ExecuteScript" -Methode des Selenium-Browsertreibers ausführen.

Sie können auch Schritt 1 und 2 überspringen und auch nur Schritt 3 versuchen. Schritt 3 würde von alleine funktionieren, aber ich bemerkte ein seltsames Verhalten in einem Szenario, in dem Schritt 3, obwohl er erfolgreich auf das Element geklickt hatte, nach dem Klicken auf das Element unerwartetes Verhalten in anderen Teilen meines Codes verursachte.

            try
            {
                //Setup the driver and navigate to the web page...
                var driver = new ChromeDriver("folder path to the Chrome driver");
                driver.Navigate().GoToUrl("UrlToThePage");

                //Find the element...
                var element = driver.FindElement(By.Id("elementHtmlId")); 

                //Step 1
                new Actions(driver).MoveToElement(element).Perform();  

                //Step 2
                element.Click();
            }
            catch (Exception)
            {
                //Step 3
                driver.ExecuteScript("document.getElementById('elementHtmlId').click();");

            }
Sujeewa
quelle
Ich hatte das gleiche Problem. Ihr Schritt 1 der Verwendung der Actions-Klasse funktioniert hervorragend. Daran hätte ich nie gedacht. Vielen Dank!
Conner
Ihr erster Schritt ist eine großartige Lösung.
Sovandara LENG
7

Ich habe diese Methode basierend auf einem Kommentar aus Tony Lâmpadas Antwort gemacht. Es funktioniert sehr gut.

def scroll_to(element)
  page.execute_script("window.scrollTo(#{element.native.location.x}, #{element.native.location.y})")
end
Roger Garza
quelle
6

Ich habe das gleiche Problem beim Ausführen des Selenskripts in Python erhalten. Folgendes habe ich verwendet, um auf das Element zu klicken:

from selenium.webdriver.common.action_chains import ActionChains


ActionChains(driver).click(element).perform()
psr
quelle
5

Ich hatte ein ähnliches Problem, als ich zwei Kontrollkästchen nacheinander aktivieren musste. Aber ich bekam den gleichen obigen Fehler. Dann habe ich zwischen meinen Schritten Wartezeit hinzugefügt, um die Kontrollkästchen zu aktivieren. Es funktioniert gut und großartig. Hier sind die Schritte: -

  When I visit /administrator/user_profiles
  And I press xpath link "//*[@id='1']"
  Then I should see "Please wait for a moment..."
  When I wait for 5 seconds
  And I press xpath link "//*[@id='2']"
  Then I should see "Please wait for a moment..."
  When I visit /administrator/user_profiles_updates
Milind
quelle
Nur hinzufügen, dass dies nicht die richtige Art ist, die Gherkin-Syntax zu verwenden. Schritte sollten in der Form "gegeben - wann - dann" sein und diese sollten nicht gemischt werden. Wenn nach einem "Dann" mehr "Wann" benötigt werden, wird wahrscheinlich ein separater Testfall benötigt.
Floella
5

Sie müssen den Fokus verwenden oder auf diesem Element scrollen. Möglicherweise müssen Sie auch explict wait verwenden.

WebElement firstbutton= driver.findElement(By.xpath("Your Element"));
Actions actions = new Actions(driver);
actions.moveToElement(element);
actions.perform();

ODER

Das Element kann aufgrund eines darüber liegenden Spinners / Overlays nicht angeklickt werden:

By loadingImage = By.id("loading image ID");
WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds);
wait.until(ExpectedConditions.invisibilityOfElementLocated(loadingImage));

ODER

Point p= element.getLocation();
Actions actions = new Actions(driver);
actions.moveToElement(element).movebyoffset(p.x,p.y).click().perform();

ODER

Wenn immer noch nicht funktionieren JavascriptExecutor

JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", firstbutton);
Shubham Jain
quelle
3

Anscheinend ist dies das Ergebnis eines "Won't Fix" -Fehlers in der Chrome-Treiberbinärdatei.

Eine Lösung, die für mich funktioniert hat (Our Mileage May Vary), finden Sie in dieser Google Group-Diskussion, Kommentar 3:

https://groups.google.com/forum/?fromgroups=#!topic/selenium-developer-activity/DsZ5wFN52tc

Der relevante Teil ist genau hier:

Ich habe das Problem seitdem umgangen, indem ich direkt zum href des übergeordneten Ankers der Spanne navigiert bin.

driver.Navigate (). GoToUrl (driver.FindElement (By.Id (embeddedSpanIdToClick)). FindElement (By.XPath ("..")). GetAttribute ("href"));

In meinem Fall verwende ich Python. Sobald ich das gewünschte Element erhalten habe, habe ich es einfach verwendet

driver.get(ViewElm.get_attribute('href'))

Ich würde jedoch erwarten, dass dies nur funktioniert, wenn das Element, auf das Sie klicken möchten, ein Link ist ...

Alpheus
quelle
3

Ich hatte das gleiche Problem mit clj-webdriver (Clojure-Port von Selenium). Ich habe gerade die vorherige Lösung der Einfachheit halber in clojure übersetzt. Sie können diese Funktion vor dem Klicken oder was auch immer aufrufen, um dieses Problem zu vermeiden.

(defn scrollTo
  "Scrolls to the position of the given css selector if found"
  [q]
  (if (exists? q) 
    (let [ loc (location-once-visible q) jscript (str "window.scrollTo(" (:x loc) "," (:y loc) ")") ] 
      (execute-script jscript))))
Jaime Agudo
quelle
3

Dies kann passieren, wenn das Element seine Position ändert, während der Treiber versucht, darauf zu klicken (ich habe dies auch mit dem IE gesehen). Der Fahrer behält die Ausgangsposition bei, aber wenn er tatsächlich darauf klickt, zeigt diese Position nicht mehr auf dieses Element. Der FireFox-Treiber hat dieses Problem übrigens nicht, anscheinend "klickt" er programmgesteuert auf Elemente.

Dies kann jedoch passieren, wenn Sie Animationen verwenden oder einfach die Höhe von Elementen dynamisch ändern (z $("#foo").height(500). B. ). Sie müssen sicherstellen, dass Sie erst auf Elemente klicken, nachdem sich ihre Höhe "eingestellt" hat. Am Ende hatte ich Code, der so 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;
});
Ohad Schneider
quelle
Dies scheint das zu sein, was ich erlebe. Ich erhalte zeitweise die Ausnahme "Anderes Element würde ..." des OP, aber Screenshots zeigen, dass das Modal auf dem Bildschirm angezeigt wird und das Element nicht abgedeckt ist, und ich verwende Wartezeiten, bevor ich auf klicke. Es stellt sich heraus, dass das Modal, auf das ich klicke, tatsächlich geöffnet wird. Abhängig davon, wann das Selen tatsächlich das DOM abtastet, kann die Ausnahme ausgelöst werden, wenn es das Modal während der Bewegung erfasst hat.
Levi Noecker
3

Ich habe dies getroffen, weil ein Ladedialog dieses Elements abdeckt. Ich löse es einfach, indem ich eine Wartezeit hinzufüge, bevor ich mit diesem Element arbeite.

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

Ich hoffe das hilft!

Huy Hóm Hỉnh
quelle
3

Erklärung der Fehlermeldung :

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

Es kann viele Gründe geben, warum das Element im Moment des Tests nicht sichtbar ist. Bitte analysieren Sie Ihre Seite erneut und finden Sie die richtige Lösung für Ihren Fall.

Lösung für den Einzelfall :

In meinem Fall tritt dieser Fehler auf, wenn ein Tooltip des Bildschirmelements, auf das ich gerade geklickt habe, über dem Element angezeigt wird, auf das ich als Nächstes klicken möchte. Defocus war eine Lösung, die ich brauchte.

  • Eine schnelle Lösung für die Defokussierung besteht darin, auf ein anderes Element in einem anderen Teil des Bildschirms zu klicken, das "nichts" bzw. "nichts" bewirkt. Nach einer Klickaktion passiert nichts.
  • Die richtige Lösung wäre, element.blur()das Element aufzurufen, das den Tooltip öffnet, wodurch der Tooltip verschwindet.
Dee
quelle
3

Der Grund für diesen Fehler ist, dass sich das Element, auf das Sie klicken möchten, nicht im Ansichtsfenster (Bereich, den der Benutzer sieht) des Browsers befindet. Um dies zu überwinden, müssen Sie zuerst zum gewünschten Element scrollen und dann den Klick ausführen.

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)')
}
sri
quelle
2

Zu Tony Lâmpadas Antwort, Kommentar Nr. 27, hat das Problem tatsächlich für mich gelöst, außer dass es Java-Code lieferte und ich Python brauchte. Hier ist eine Python-Funktion, die zur Position des Elements scrollt und dann darauf klickt.

def scroll_to_and_click(xpath):
    element = TestUtil.driver.find_element_by_xpath(xpath)
    TestUtil.driver.execute_script('window.scrollTo(0, ' + str(element.location['y']) + ');')
    element.click()

Dies löste das Problem für mich in Chrome 34.0. In Firefox 28.0 und IE 11 wurde kein Schaden verursacht. Diese Browser sind nicht vom Problem betroffen, aber das Scrollen zur Position des Elements vor dem Klicken ist immer noch keine schlechte Sache.

Steve Saporta
quelle
2

Vielleicht ist es keine wirklich saubere Lösung, aber es funktioniert:

try:
    el.click()
except WebDriverException as e:
    if 'Element is not clickable at point' in e.msg:
        self.browser.execute_script(
            '$("{sel}").click()'.format(sel=el_selector)
        )
    else:
        raise
Radeklos
quelle
2

Ich habe diesen Fehler bekommen, weil ich einen Hover getestet habe und dann auf den Link unter dem Tooltip klicken musste. Die Lösung bestand darin, page.find('.sp-logo').hovervorher etwas hinzuzufügen click_link, um den Tooltip aus dem Weg zu räumen.

Dan Kohn
quelle
2

Es ist lustig, die ganze Zeit, die ich damit verbracht habe, mir die verschiedenen Antworten anzusehen, hatte niemand das Offensichtliche ausprobiert, was ich natürlich auch nicht getan hatte. Wenn Ihre Seite dieselbe ID hat, die mehrfach verwendet wurde, wie meine ("newButton"), und die gewünschte nicht die erste gefundene ist, wird dieser Fehler höchstwahrscheinlich angezeigt. Am einfachsten (C #):

var testIt = driver.FindElements(By.Id("newButton"));

Beachten Sie, dass es sich um FindElements handelt, nicht um FindElement.

Testen Sie anschließend, wie viele Ergebnisse aus dem Abruf stammen. Wenn es das zweite ist, können Sie verwenden:

testit[1].Click();

Oder lassen Sie jemanden, der die IDs wiederverwendet, um sie zu reparieren.

CargoMeister
quelle
Wenn dies daran liegt, dass diese ID mehrere Schaltflächen enthält und jeweils nur eine angezeigt wird, besteht eine überlegene Lösung darin, mithilfe von LINQ das erste sichtbare Element zu finden ( .First(x => x.Visible)an den FindElements-Aufruf anhängen ) und darauf zu klicken, wenn es nicht null ist.
Sean Duggan
2

Nachdem alle genannten Vorschläge getestet wurden, funktionierte nichts. Ich habe diesen Code gemacht. Es funktioniert, ist aber nicht schön

public void click(WebElement element) {
    //https://code.google.com/p/selenium/issues/detail?id=2766 (fix)
    while(true){
        try{
            element.click();
            break;
        }catch (Throwable e){
            try {
                Thread.sleep(200);
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
        }
    }
}

public void click(String css) {
    //https://code.google.com/p/selenium/issues/detail?id=2766 (fix)
    while(true){
        try{
            driver.findElement(By.cssSelector(css)).click();
            break;
        }catch (Throwable e){
            try {
                Thread.sleep(200);
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
        }
    }
}
Bruno Lee
quelle
2

Ich mache eine Art rohe Kraft von Klicks und es funktioniert für mich.

try:
    elem.click()
except:
    print "failed to click"
    size = elem.size
    mid_of_y = int(size["height"])/2
    stepts_to_do_to_left = int(size["width"])
    while stepts_to_do_to_left > 0:
        try:
            print stepts_to_do_to_left, mid_of_y
            action = webdriver.common.action_chains.ActionChains(driver)
            action.move_to_element_with_offset(elem, mid_of_y, stepts_to_do_to_left)
            action.click()
            action.perform()
            print "DONE CLICK"
            break
        except:
            pass
Super Mario
quelle
2

Wenn Sie jQueryauf der Seite geladen haben , können Sie den folgenden Javascript-Befehl ausführen:

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

Beispiel mit Python Executor:

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

Ich hatte das gleiche Problem und es wurde durch einen ID-Konflikt zwischen dem Div und dem Link innerhalb des Div verursacht. Also klickte der Fahrer auf das Div anstatt auf den Link, den ich wollte. Ich habe die Div-ID geändert und es hat richtig funktioniert.

Vor:

<div id="logout"><a id="logout" href="logoutLink">logout</a></div>

Nach:

<div id="differentId"><a id="logout" href="logoutLink">logout</a></div>
Jordan Silva
quelle
Kein Wunder, dass Sie Probleme hatten. Es sollte nur eine ID auf einer Seite geben. Das war schlechtes Design, keine Problemumgehung.
Dave Lawrence
1

In Drupal bei Verwendung von Selen :

    // Get element.
    $element = $this->driver->getElement('xpath=//input');        
    // Get screen location.
    $location = $element->getLocation();
    // To make sure that Chrome correctly handles clicking on the elements 
    // outside of the screen, we must move the cursor to the element's location.
    $this->driver->moveCursor($location['x'], $location['y']);

    // Optionally, set some sleep time (0.5 sec in the example below) if your
    // elements are visible after some animation.
    time_nanosleep(0, 500000000);

    // Click on the element.
    $element->click();
Alex Skrypnyk
quelle