2017-05-04 1 views
0

Ich versuche, auf eine Schaltfläche "Speichern" zu klicken. Html of Save button:Fehler: Element ist nicht sichtbar, wird beim Zugriff auf ein Element mit Dynamic Xpath angezeigt, während der relative Xpath funktioniert

<div class="button button--large ng-binding" ng-click="params.applyWrapper()">Save</div> 

Jetzt, wenn ich relative XPath verwenden, um einen Klick zu bekommen, funktioniert es gut. Es wird kein Fehler angezeigt und das Klicken auf dieses Element ist erfolgreich.

driver.findElement(webdriver.By.xpath(".//*[@id='navcontainer']/ons-page[4]/div[2]/div/ng-form/fieldset/ul/li[8]/div")).click(); 

jedoch die Verwendung dynamischer XPath wie unten angegeben ergibt sich ein Fehler „ElementNotVisibleError: Element nicht sichtbar“

driver.findElement(webdriver.By.xpath(".//div[contains(text(),'Save')]")).click(); 

, was der Grund sein könnte, und wie bekomme ich einen Klick auf dieses Element mit dynamischer XPath ?

+0

Verwenden Sie explizit warten auf die Schaltfläche sichtbar sein und versuchen Sie es. Es besteht die Möglichkeit, dass Ihr erstes xpath-Element das Element vom übergeordneten Knoten findet, so dass es sich in Ihrem dynamischen xpath befindet. Es ist jedoch unsichtbar, da es Zeit benötigt, um sichtbar zu werden – NarendraR

+0

Hi @NarendraRajput .. nach Ihrem Vorschlag habe ich versucht, das Element zuerst zu finden und dann darauf zu warten, dass es wie unten angegeben sichtbar ist. var button = driver.wait (webdriver.until.elementLocated (webdriver.By.xpath ("// div [enthält (text(), 'Speichern')] "))); driver.wait (bis.ElementIsVisible (button)). Click(); 'Die Wartezeit ist unendlich. Der Treiber wartet weiterhin darauf, dass das Element sichtbar ist. Bei Verwendung von Absolute Xpath dauerte es nicht lange, auf das Element zuzugreifen. Etwas ist fischig. –

+0

Wo fügen Sie die Wartezeit in diesem Code hinzu? – kushal

Antwort

0

Erklärung, warum Element nicht sichtbar Fehler auftauchen würde wäre, dass vorherige Seite auch eine Schaltfläche "Speichern" und da in den meisten Implementierungen wir vorherige Seite nicht zerstören und nur versteckt, webdriver war das Lokalisieren der Schaltfläche Speichern auf vorherige Seite aber konnte nicht darauf zugreifen, da es versteckt ist, daher ist der Fehler Element nicht sichtbar. Die Verwendung des absoluten X-Pfads unterscheidet die Save-Schaltflächen auf der vorherigen und aktuellen Seite effektiv, während der dynamische Xpath für die beiden Schaltflächen "Speichern" genau gleich ist. (Da gibt es kein Attribut, das die XPath von anderen unterscheidet.)

driver.findElement(By.xpath("//*[text()='Save']")).click(); 

Nun müssen wir einen Weg Dynamische XPath machen sowohl für die ‚Speichern‘ Tasten unterschiedlich. Dies kann mit Hilfe der Xpath-Achsenmethode durchgeführt werden. In dieser Methode identifizieren wir ein Element, das dem Element vorausgeht oder folgt, auf das zugegriffen werden soll, und schreiben einen X-Pfad in Bezug auf dieses vorhergehende/folgende Element.

In meinem Fall ist der Schaltfläche 'Speichern' auf der aktuellen Seite ein Eingabe-Tag vorangestellt, und der Schaltfläche Speichern auf der vorherigen Seite ist ein span-Tag vorangestellt. Dies ermöglicht es mir den XPath für diese beiden Tasten unterscheiden sich wie folgt:

Xpath für Save-Taste auf Aktuelle Seite:

driver.findElement(By.xpath("//input[@name='defaults']//following::div[1]")).click(); 

// folgende :: div [1] in diesem XPath repräsentiert die Schaltfläche "Speichern", der ein Eingabe-Tag vorangestellt ist.

Xpath für Save-Taste auf Vorherige Seite:

driver.findElement(By.xpath("//span[text()='Test']//following::div[1]")).click(); 

// folgende :: div [1] in diesem XPath stellt die Schaltfläche 'Speichern', die von einem span-Tag voraus.

0

Wie Sie diese absolute XPath erwähnt gearbeitet:

driver.findElement(webdriver.By.xpath(".//*[@id='navcontainer']/ons-page[4]/div[2]/div/ng-form/fieldset/ul/li[8]/div")).click(); 

Diese logische XPath sollte auch so gut funktionieren:

driver.findElement(webdriver.By.xpath("//div[@class='button button--large ng-binding'][text()='Save']")).click(); 

Wie Sie ElementNotVisibleError: element not visible Ausnahme konfrontiert sind, können Sie einige ExplicitWait für das Element hinzufügen um sichtbar zu sein & dann klicken Sie wie folgt:

WebElement myElement = (new WebDriverWait(driver, 15)).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@class='button button--large ng-binding'][text()='Save']"))); 
myElement.click(); 

Lassen Sie mich wissen, ob dies Ihnen hilft.

+0

gleicher Fehler "ElementNotVisibleError: Element nicht sichtbar". –

+0

@PawanJuyal Meine Antwort wurde aktualisiert. Lass mich den Status wissen. Danke – DebanjanB

+0

Ich habe warten verwendet, um die Sichtbarkeit dieses Elements zu überprüfen. Hat nicht funktioniert. Ich finde Anderssons Analyse zu diesem Thema eine gültige. Dieses Element existiert auf der vorherigen Seite sowie auf der aktuellen Seite, und der Treiber muss mit dem auf der Seite interagieren, die derzeit ausgeblendet ist. Deshalb bekomme ich diesen Fehler. Jetzt Frage ist, wie ich auf dieses Element auf der aktuellen Seite zugreifen kann. –