2016-09-08 4 views
0

Ich weiß, dass es einige ähnliche Fragen gibt. Ich denke, ich habe sie durchgespielt, aber ich kann nicht herausfinden, wie ich mein Problem lösen kann.Selen 'Element kann nicht gefunden werden'

Das Problem ist wie folgt. Ich versuche, den Selenium-Treiber zu verwenden, um auf das Symbol/die Schaltfläche auf der Website "https: /unsplash.com/" zu klicken, mit der die Anzeige von einem einzelnen Gitter in ein anderes Gitter geändert wird.

Der HTML-Tag für das Symbol ist wie folgt:

<svg class="N1Ri-" version="1.1" viewBox="0 0 32 32" 
    width="32" height="32" aria-labelledby="icon-title-635 
    icon-desc-636" aria-hidden="false" data-reactid=".pm6nw1xm9s.4.0.0.3.0.0.0.0.1.0"> 
<path d="M0 2v10c0 1.106 0.896 2 2 
    2h10c1.104 0 2-0.894 2-2v-10c0-1.106-0.896-2-2-2h-10c-1.104 0-2 
    0.894-2 2zM2 18c-1.104 0-2 0.894-2 2v10c0 1.106 
    0.896 2 2 2h10c1.104 0 2-0.894 2-2v-10c0-1.106-0.896-2-2-2h-10zM20 18c-1.106 0-2 
    0.894-2 2v10c0 1.106 0.894 2 2 2h10c1.106 0 2-0.894 2-2v-10c0-1.106-0. 
    894-2-2-2h-10zM20 0c-1.106 0-2 0.894-2 2v10c0 1.106 
    0.894 2 2 2h10c1.106 0 2-0.894 2-2v-10c0-1.106-0.894-2-2-2h-10z" 
    data-reactid=".pm6nw1xm9s.4.0.0.3.0.0.0.0.1.0.1"> 
</path> 
</svg> 

Der Java-Code, die ich habe, ist wie folgt:

public static void main(String[] args) { 
System.setProperty("webdriver.gecko.driver","/home/ xxxx /Documents/Selenium/geckodriver"); 
    WebDriver driver = new FirefoxDriver(); 
    driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); 
    driver.get("https:/unsplash.com/"); 

    //I've tried all of the following independently with the same result: 'Unable to locate element' 
    driver.findElement(By.className("N1Ri")).click(); 
    driver.findElement(By.className("N1Ri-")).click(); 
    driver.findElement(By.className("svg.Hd1sr")).click(); 
    driver.findElement(By.xpath("//a[contains(@class,'N1Ri')]")).click(); 
    driver.findElement(By.xpath("//*[@id='svg.Hd1sr']")).click(); 
} 

Wie Sie im Code sehen, ich eine Reihe versucht von Optionen (Ich habe viele andere Kombinationen ausprobiert), aber immer mit dem gleichen Ergebnis: Das Element konnte nicht gefunden werden

Ich habe auch Senenium IDE versucht und beim Klicken auf das Symbol/die Schaltfläche zeigte die Quelle: LOCAT ODER ERKENNUNG FEHLGESCHLAGEN

Ich nehme an, dass es etwas im HTML-Code gibt, der verhindert, dass die Seite leicht geknackt wird.

Meine Fragen sind zweifach: - Was ist der Code, den ich in diesem Fall verwenden muss? - (am wichtigsten) Wie kann ich den Code in solchen Fällen finden?

Dank

Antwort

1

Versuchen Sie, diese XPath

("//a[contains(@href,'multi')]/*[@class='Hd1sr']") 

Mit dem svg Tag XPath versagt.

oder CSS

"a[href*='multi']>svg[class='Hd1sr']" 
+0

Danke Grasshopper, mit dem Xpath funktionierte perfekt. Mit dem CSS habe ich wieder den gleichen 'Unable to locate element'-Fehler. Aber wie hast du den Code herausgefunden? Warum brauchst du @ href, 'multi', zum Beispiel? Ich kann die Syntax nicht herausfinden. Gibt es einen Referenzcode, der dabei helfen kann? – Selrac

+0

@Selrac Sie können auf google und youtube viele Ressourcen für xpath- und css-Locator für Selen erhalten. Es ist ziemlich leicht zu holen. Andernfalls können Sie Firebug auf Firefox installieren und es wird Ihnen automatisch die Locators geben. Aber möglicherweise müssen Sie sie ändern, um perfekt zu sein. – Grasshopper

+0

Ich werde es versuchen. Übung macht den Meister. Aber ich habe es jetzt versucht und es hat nicht funktioniert. Bei der Überprüfung des HTML-Codes habe ich festgestellt, dass er sich geändert hat, und jetzt muss ich folgendes verwenden: driver.findElement (By.xpath ("// a [enthält (@ href, 'multi')]/* [@ class = 'N1Ri -'] ")). Click(); Komisch, dass ich jetzt N1Ri- sehe und 8 Stunden zuvor habe ich Hd1sr gesehen. – Selrac

0

Versuchen:

driver.findElement(By.cssSelector("svg.N1Ri-")).click(); 

Aus irgendeinem Grund dazu die XPath Äquivalent nicht funktionieren würde, ich fürchte, ich habe keine Ahnung, warum haben.

+0

Dank Jsmith. Obwohl der Code den Fehler nicht verursacht hat, hat er den Klickbefehl nicht wirklich ausgeführt – Selrac

Verwandte Themen