2017-11-28 11 views
3

Ist es möglich Elemente des Shadow DOM mit Java und Selen zu finden?Zugriff auf Elemente innerhalb der Schatten-Wurzel

Ich mag Element aus dem Schatten Wurzel

<paper-input id="homeSearch" class="home-search-btn home-inputs" placeholder="Where would you like to go?" no-label-float="" tabindex="0" aria-disabled="false"><iron-icon icon="-search-" slot="prefix" class="form-icons search-icon"></iron-icon></paper-input>

ich auf homesearch A Eingang senden möge nehmen Wie driver.findElement(By.id("homesearch")); ich im Internet suche, aber keine sachgemäße Lösung.

enter image description here

wird jede Art von Hilfe wirklich

+2

Teilen Sie nicht HTML-Code-Beispiel als Bilddatei - geben Sie stattdessen Text – Andersson

+0

nur eine Minute, die ich teile – zsbappa

+0

Es tut mir leid, ich versuche, HTML-Site kopieren nicht zulassen senden Code organisiert Weg ... Wenn Sie möchten, kann ich Website teilen Adresse an Sie – zsbappa

Antwort

1

Erste Elemente innerhalb ein Schatten dom Wurzel mehreren Schritten geschätzt.

Zunächst erhalten die ‚Gastgeber‘ Element, in Ihrem Fall die Eingabe mit dem Attribut page = "home"

WebElement host1 = driver.findElement(By.cssSelector("vrs-app[page='home']")); 

Danach müssen Sie einen JavaScript-Skript auszuführen, um den Schatten Wurzel von dem Host zu erhalten, können Sie bekommen die Schattenwurzel durch Aufruf von .shadowRoot auf einem Webelement.

WebElement shadowRoot = (WebElement)((JavascriptExecutor) driver).executeScript("return arguments[0].shadowRoot", host); 

Aber es gibt einen Haken, Ihre Eingabe ist im Innern mehrerer Schatten dom verschachtelt, so dass Sie diese ein paar Mal zu tun. Effizienteste Weg, dies zu tun, ist es, ein Verfahren zu verwenden, zum Beispiel:

public WebElement GetShadowRoot(WebElement host) { 
    WebElement shadowRoot = (WebElement)((JavascriptExecutor) driver).executeScript("return arguments[0].shadowRoot", host); 
    return shadowRoot ; 
} 

Danach tauchen Sie sich alle Schatten Wurzeln, bis Sie den Host erreichen Sie benötigen, wie folgt aus:

WebElement host1 = driver.FindElement(By.cssSelector("vrs-app[page='home']")); 
WebElement shadow1 = GetShadowRoot(host1); 

WebElement host2 = shadow1.FindElement(By.cssSelector("vrs-home")); 
WebElement shadow2 = GetShadowRoot(host2); 

// We've reached the shadow dom containing the input 
// Note: I'm not using By.id since this may throw an error 
WebElement paperInput = shadow2.findElement(By.cssSelector("paper-input[id='homeSearch']")); 

Jetzt können Sie tun, was Sie mit paperInput machen wollen.

Seitennotiz: Ich weiß, dass diese Methode in Chrome funktioniert (nur getestet), habe es nicht in anderen Browsern getestet. Außerdem kenne ich Java nicht, daher könnte die Sprachsyntax ein wenig anders sein.

+0

Nur getestet, mit der Seite, die Sie zuvor zur Verfügung gestellt, kann ich Text an das WebElement paperInput senden – Marcel

+0

ist es möglich, mir vollständigen Code senden .. Ich habe Fehler – zsbappa

+0

Was ist das Fehler du? – Marcel