2015-04-08 25 views
11

Ich verwende Selen für Testskript. Ich bekomme folgenden Fehler und dieser Fehler tritt zufällig auf. Wenn ich 10 Mal renne, bekomme ich das etwa zweimal. Es ist also nicht wirklich reproduzierbar. Weiß jemand, warum das passiert? Das Element, auf das ich klicken möchte, ist definitiv im Browser sichtbar und bewegt sich nicht, so dass die Größe oder das Ziehen des Elements nicht geändert werden muss. Ich benutze Chrome Webdriver und ich lese andere Strategien zur Fehlerbehebung (Debugging "Element is not clickable at point" error) und sie scheinen nicht relevant für mein Problem. Ich habe auch genug Zeit gewartet.Selen - Element ist nicht anklickbar

UnknownError: unknown error: Element is not clickable at point (167, 403). Other element would receive the click: <div class="leftMasterBackground"></div> 
+0

Können Sie uns Informationen darüber geben, auf welches Element Sie klicken möchten?Es wäre auch interessant, welche Elemente es umgeben und welche Aktionen vor dem Klick ausgeführt werden. –

+0

Verwenden Sie explizit warten, bis das Element zum Klicken sichtbar ist. –

+0

Sind alle Skripts und Stile auf der Seite fertig geladen, wenn dieser Fehler auftritt? – FDM

Antwort

8

Es gibt eine Reihe von Schritten, die Sie tun können, um die Stabilität zu verbessern und gleichzeitig auf verschiedene UI-Elemente klicken:

  • Explizit wartet es ist Präsenz im DOM
  • Blättern Sie in die Elementansicht
  • Überprüfen Sie, ob anklickbar ist

Hilft es der Stabilität?

WebDriverWait wait = new WebDriverWait(driver, 3) 
JavascriptExecutor js = ((JavascriptExecutor) driver) 

//presence in DOM 
wait.until(ExpectedConditions.presenceOfElement(By.id("ID"))); 

//scrolling 
WebElement element = driver.findElement(By.id("ID"))); 
js.executeScript("arguments[0].scrollIntoView(true);", element); 

//clickable 
wait.until(ExpectedConditions.elementToBeClickable(By.id("ID"))); 

Wenn Sie darüber hinaus die Standard Actions Schnittstelle mit individuellere ein außer Kraft setzen wird entscheiden, können Sie zwei Arten von Klicks (zum Beispiel) verwenden: click(), die diese Stabilität Schritte haben und fastClick() alle, die das sein wird, Standard-Klick ohne irgendeine Änderung.

+0

Ich habe nur den // scrollenden Block mit meinem Problem benutzt und es hat funktioniert. Vielen Dank. Es ist wahrscheinlich eine trockenere Lösung, um dies zu einer Funktion, um wiederholt über Ihre Winkelmesser Tests zu machen. Ich bin sicher, dass es viele Orte gibt, an denen Sie zu einer bestimmten Stelle auf der Seite scrollen müssen, um zu klicken. – JCC

+0

@ JCC in unserer Lösung, diese nativen Selenbibliotheken in zusätzliche Abstraktionsebene verpackt. So haben wir Methoden wie: element.scrollToElement(). Click(), element.waitUntilPresence(). Klicken() und etc. – Stas

+1

fantastischer Job! Das Wichtigste ist SCROLL! – Seva

2

Ich habe durch den Fang die Ausnahme gelöst und es so zu verwalten:

 WebDriver driver = new ChromeDriver(); 
     WebElement element = driver.findElement(By.id("ID")); 
     boolean clicked = false; 
     do{ 
      try { 
       element.click(); 
      } catch (WebDriverException e) { 
       continue; 
      } finally { 
       clicked = true; 
      } 
     } while (!clicked); 
+0

Werfen Sie einen Blick auf 'ExpectedConditions.isClickable()' – LeeGee

+1

Ich habe diese Funktionalität bereits gesehen, aber es funktioniert nicht gut mit Chromtreiber. Was passiert ist: Die Bedingung gibt 'true' zurück, aber das Element ist nicht effektiv anklickbar. – billi90

+0

Ich hatte diesen Fehler, der mich auf diese Seite gebracht hat. Ist Ihr Element durch ein anderes (transparentes) Element abgedeckt? Ist es animiert? Ist es möglich, JS mit '.executeScript' (oder dem Äquivalent Ihrer Bindung) zu injizieren, um auf das Element zu klicken? – LeeGee

1

Klick übergeordnetes Element des Elements, das Sie klicken mögen. Dies kann nur eine Umgehungslösung sein.

2

Ich hatte auch das gleiche Problem mit Chrome. Ich habe gelöst, dass auf das Element, bevor Sie auf eine Zeile Code setzen:

scrollToViewElement(driver,xpath); 
0
  • Diese nur auf Chrom geschieht so funktioniert es auf IE und Firefox
  • ChromeDriver immer klickt auf die Mitte des Elements
  • Der Grund, warum Chrome-Treiber nicht den richtigen Bildschirmstandort der Verknüpfung berechnet.

Lösung:

// ein Element finden und definieren es

WebElement elementToClick = driver.findElement(By.xpath("some xpath")); // Scroll the browser to the element's Y position ((JavascriptExecutor) driver).executeScript("window.scrollTo(0,"+elementToClick.getLocation().y+")"); // Click the element elementToClick.click();

0

ich das gleiche Problem bekam aufgrund eines Spinners wurde das Element versteckt.

Ich gab Xpath und es behob das Problem. Andere Leute haben vorgeschlagen, 1. Scroll 2. Schlaf arbeitete auch für sie.

+0

Sie können den folgenden Fehler auch mithilfe der Wartebedingung lösen: waitUntilTrueOrTimeout (ExpectedConditions.invisibilityOfElementLocated (elementHidingOtherElement))); geschützt V waitUntilTrueOrTimeout (final ExpectedCondition isTrue) { Rückgabe waitUntilTrueOrTimeout (isTrue, waitTimeOutSeconds); } geschützt V waitUntilTrueOrTimeout (final ExpectedCondition isTrue, final int waitTimeSeconds) { neue WebDriverWait return (this.driver, waitTimeSeconds) .ignoring (StaleElementReferenceException.class) .bis (isTrue); – dimyo

Verwandte Themen