2014-07-25 4 views
5

Ich erstelle ein Skript, das die Suche nach einem Datensatz und dann die Aktualisierung des Datensatzes beinhaltet. Auf dem Suchbildschirm hat der Benutzer die Möglichkeit, erweiterte Suchoptionen anzuzeigen. Um die erweiterte Suche ein- oder ausblenden zu können, wird eine Taste gedrückt.Selenium Webdriver - mit isDisplayed() in If-Anweisung funktioniert nicht

<a title="Searches" href="javascript:expandFilters()"><img border="0" align="absmiddle" alt="Advanced" src="****MASKED URL****"></a> 

Der einzige Unterschied zwischen den Eigenschaften der Suchtaste, wenn es angezeigt wird oder die erweiterte Suche versteckt ist das img src:

Wenn erweiterte Suche die IMG src mit „/ Styles/_images endet versteckt /advanced_button.jpg ", wenn die erweiterte Suche sichtbar ist, endet der IMG src mit" /Styles/_Images/basic_button.png "

Wenn ich die Seite öffne, werden manchmal die erweiterten Suchoptionen angezeigt, manchmal nicht . Der Wert, nach dem ich suchen möchte, erscheint im Abschnitt "Erweitert". Damit mein Skript funktioniert, habe ich eine IF-Anweisung hinzugefügt.

<input type="text" value="" maxlength="30" size="30" name="guiSystemID"> 

Die IF-Anweisung sucht die Felder, die ich brauche Daten in einzugeben, und wenn das Feld nicht existiert, das würde zeigen, dass die erweiterten Optionen nicht sichtbar sind, muss ich auf die Schaltfläche klicken, um das zu erweitern Suchoption.

Ich habe die folgende IF-Anweisung erstellt.

Wenn ich das Skript ausführen und die erweiterte Suche erweitert wird, wird das Skript erfolgreich ausgeführt. Wenn ich das Skript ausführe und die erweiterte Suche nicht erweitert wird, schlägt das Skript fehl und weist darauf hin, dass das Objekt "guiSystemID" nicht gefunden werden kann. Das ist frustrierend, denn wenn es nicht gefunden werden kann, möchte ich, dass das Script fortfährt und in den True-Pfad der IF-Anweisung eintritt.

Hat jemand irgendwelche Vorschläge darüber, wie ich sonst beurteilen könnte, ob das Feld erscheint, ohne dass das Skript fehlschlägt, weil es das Feld nicht finden kann.

Vielen Dank im Voraus

Simon

Antwort

15

Ich könnte spät dran sein, aber es könnte jemand anderen auf der Suche nach dem gleichen helfen.

Ich hatte kürzlich ein ähnliches Problem während der Arbeit mit isDisplayed(). Mein Code war so etwas wie dieses

if(driver.findElement(By.xpath(noRecordId)).isDisplayed())                           
{   
    /**Do this*/  
}  
else  
{  
    /**Do this*/  
} 

Dieser Code funktioniert ziemlich gut, wenn das Element, das wirdangezeigt Geschenk zu finden versucht, ist. Aber wenn das Element nicht vorhanden ist, sucht es weiter und löst daher eine Ausnahme aus "NusuchElementFound". Es gab also keine Möglichkeit, den anderen Teil zu testen.

Ich habe einen Weg gefunden, damit zu arbeiten (Umgeben Sie die {wenn, sonst} mit Versuch und fangen Block, sagen Sie so etwas.

public void deleteSubVar() throws Exception 
{   
    try 
    {  
    if(driver.findElement(By.xpath(noRecordId)).isDisplayed())  
    {  
     /**when the element is found do this*/  
    }  
    }  
    catch(Exception e)  
    {  
    /**include the else part here*/  
    }  
}   

this helps :)

+0

Danke .... es hat mir geholfen. –

+0

Ziemlich hilfreich !. Danke – Deep

+0

Diese Lösung funktionierte für mich. Vielen Dank. – Automationtested

2

Ich habe mit .isDisplayed gemischte Ergebnisse() in der Vergangenheit. Da es verschiedene Methoden gibt, ein Element im DOM zu verstecken, läuft es meiner Meinung nach auf ein Problem mit der Flexibilität von isDisplayed() hinaus. Ich tendiere dazu, eigene Lösungen zu finden. Ich werde ein paar Dinge teilen, die ich mache, und dann eine Empfehlung für dein Szenario abgeben.

Wenn ich nicht etwas sehr Spezifisches habe, neige ich dazu, eine Wrapper-Methode zu verwenden, die eine Reihe von Prüfungen auf Sichtbarkeit durchführt. Hier ist das Konzept, ich überlasse Ihnen den eigentlichen Implementierungsansatz. Für allgemeine Beispiele hier, nehmen Sie einfach "Locator" ist Ihre gewählte Methode des Ortes (CSS, XPath, Name, ID, etc.).

Die erste und einfachste Überprüfung ist, ob das Element überhaupt im DOM vorhanden ist. Wenn es nicht vorhanden ist, ist es sicherlich nicht sichtbar.

boolean isPresent = driver.findElements(locator).size() > 0; 

Dann wird, wenn das wahr zurückgibt, werde ich die Abmessungen des Elements überprüfen:

Dimension d = driver.findElement(locator).getSize(); 
boolean isVisible = (d.getHeight() > 0 && d.getWidth() > 0); 

Nun Dimensionen, zu Zeiten, kann ein falsch positives zurück, wenn das Element in der Tat hat Höhe und Breite größer als Null, aber zum Beispiel deckt ein anderes Element das Zielelement ab, so dass es auf der Seite versteckt erscheint (zumindest habe ich es in der Vergangenheit schon ein paar Mal gesehen). So, als Endprüfung (wenn die Dimension Prüfung liefert true), sehe ich das style-Attribut des Elements (wenn man definiert wurde) und stellen Sie den Wert eines boolean entsprechend:

String elementStyle = driver.findElement(locator).getAttribute("style"); 
boolean isVisible = !(elementStyle.equals("display: none;") || elementStyle.equals("visibility: hidden;")); 

Diese Arbeit für Die Mehrheit der Elementsichtbarkeitsszenarien, denen ich begegne, aber es gibt Zeiten, in denen dein Frontend-Entwickler etwas anderes tut, das alleine behandelt werden muss.

Ein einfaches Szenario ist, wenn es eine CSS-Klasse gibt, die die Sichtbarkeit von Elementen definiert. Es könnte alles benannt werden, also nehmen wir "versteckt" an, wonach wir suchen müssen. In diesem Fall sollte eine einfache Überprüfung des ‚Klasse‘ Attributs ergibt geeignete Ergebnisse (falls eine der oben genannten Ansätze scheitern, dies zu tun):

boolean isHidden = driver.findElement(locator).getAttribute("class").contains("hidden"); 

Nun, für Ihre spezielle Situation, auf der Grundlage der Informationen, die Sie‘ Ich würde empfehlen, einen booleschen Wert basierend auf der Auswertung des "src" -Attributs zu setzen. Dies wäre ein ähnlicher Ansatz für die CSS-Klassenüberprüfung, der oben verwendet wird, aber in einem etwas anderen Kontext verwendet wird, da wir genau wissen, welches Attribut sich zwischen den beiden Zuständen ändert. Beachten Sie, dass dies nur auf diese Weise funktioniert, wenn es zwei Zustände des Elements gibt (Advanced und Basic, wie Sie bemerkt haben). Wenn es mehr Zustände gibt, würde ich einen Enum-Wert oder etwas Ähnliches einstellen. So stellt das Element unter der Annahme entweder Advanced oder Basic:

boolean isAdvanced = driver.findElement(locator).getAttribute("src").contains("advanced_button.jpg"); 

Von jeder dieser Ansätze, sobald Sie Ihre boolean Wert haben, können Sie Ihre if/then entsprechend Logik beginnen.

Ich entschuldige mich dafür, dass ich lange damit umgehe, aber hoffentlich hilft es, dich auf den richtigen Weg zu bringen.

+2

Während ich mit Ihnen über die "Seltsamkeiten" einverstanden bin, die 'isDisplayed' bringen kann, duplizieren Sie tatsächlich genau, was es bereits tut. Selen ist Open Source, denn der verwendete JS-Code lebt [hier] (https://github.com/SeleniumHQ/selenium/blob/master/javascript/atoms/dom.js#L557). Dies macht genau das Gleiche wie Sie tun (z. B. Höhe und Breite, Anzeige Stile etc.). Sie können auch die WebDriver-Spezifikation anzeigen, in der [Details zu diesen Schritten] (http://www.w3.org/TR/webdriver/#determining-visibility) aufgeführt sind. Persönlich kommt es darauf an, dass es keine "one size fits all" Möglichkeit gibt, es zu überprüfen. – Arran

1

Verwendung von Try-Catch trotzt den eigentlichen Zweck wirdangezeigt() verwenden als Wenn die Bedingung, kann man unter Code schreiben, ohne die Verwendung von "if"

try{ 
driver.findElement(By.xpath(noRecordId)).isDisplayed(); 
//Put then statements here 
    } 
Catch(Exception e) 
{//put else statement here.} 
-2

isDisplayed() ist eine boolesche Methode, dh es gibt wahr oder falsch zurück. Im Grunde wird diese Methode verwendet, um herauszufinden, ob das Element auf der Webseite angezeigt wird oder nicht.

Verwandte Themen