2017-07-18 3 views
0

Ich möchte überprüfen, ob meine IWebElement angezeigt wird oder nicht. Wenn ich versuche, die IWebElement in der Klasse zu erreichen und zu überprüfen, ist alles in Ordnung, aber wenn ich es an meine KontrolElement() Funktion sende, bekomme ich eine NullReferenceException. KontrolElemet() ist erforderlich, da dieser Prozess mehrmals stattfindet.IWebElement wird null, nachdem es an eine Funktion gesendet wurde

KontrolElement():

//This is inside a class called 'Helpers' 
public void KontrolElement(IWebDriver WebDriver, IWebElement WebElement, string msg) 
{ 
    try 
    { 
     //"WebElement" is null 
     Assert.IsTrue(WebElement.Displayed); 
    } 
    catch (AssertionException) 
    { 
     Console.WriteLine("Kontrol: " + msg); 

     //Sends an E-mail with the screenshot of the page attached to it 
     new ScreenShot().Crush(WebDriver, msg, ""); 
    } 
} 

Wie verwende ich es ('el' ist in der Regel ein Objekt innerhalb einer IReadOnlyCollection, die mit einer foreach-Schleife iterared ist):

//This takes place in the PageObject class which extends 'Helpers' 
IWebElement el = WebDriver.FindElement(By.ClassName("listTop")); 

//Console.WriteLine(el.Displayed) outputs True 

KontrolElement(WebDriver, el, "el is not displayed"); 

Hat jemand ein Problem wie konfrontiert Dies? Was können die alternativen Lösungen sein?

+0

Ich denke, es ist unmöglich, null zu sein. Was passiert, wenn Sie die 'Console.WriteLine (el.Displayed)' auskommentieren? Siehst du sowohl "wahr" als auch "el wird nicht angezeigt" in der Konsole? – Buaban

+1

Es scheint, dass es mehr zu dieser Geschichte geben muss, hast du den ganzen Prozess sorgfältig durchlaufen, um sicherzustellen, dass die Dinge so genannt werden, wie du es erwartest? Der obige Code in seiner minimalistischen Form funktioniert, ich habe ihn getestet, um sicherzustellen, dass ich nichts Offensichtliches verpasse. Sie haben mehr zu tun als oben gezeigt, was dazu führt, dass 'KontrolElement' mit einem'IWebElement' aufgerufen wird. – mrfreester

+0

10 @mrfreester Ich habe herausgefunden, dass die 'NullReferenceException' etwas anderes damit zu tun hat. Außerdem habe ich 'KontrolElement() 'in der Frage abgeschlossen und ich bin mir sicher, dass' NullReferenceException' in diese Funktion geworfen wird. –

Antwort

0

Ich bin kein großer Fan von Wickeln Assert s oder alles so einfach in eine Funktion zu wickeln. Was gewinnst du? Mach die Dinge nicht komplizierter, als sie sein müssen.

Entfernen Sie die Funktion und benutzen Sie einfach den Code unten in Ihre Skripte

IWebElement el = WebDriver.FindElement(By.ClassName("listTop")); 
Assert.IsTrue(el.Displayed, "Verify element is displayed"); 

Ich würde „Element“ ändern in der Assertion Kommentar zu etwas spezielleren, z.B. "Bestätigen Sie die Login-Schaltfläche wird angezeigt".

Wenn Sie darauf bestehen, die Funktion zu verwenden, warum geben Sie IWebDriver weiter, wenn Sie sie nicht verwenden?

Eine andere Sache ... fangen eine generische Exception ist keine gute Praxis. Fang nur an, was du vorhast zu handhaben.

+0

Ich würde das alles als Kommentare +1 geben, aber ich bin mir nicht sicher, ob das tatsächlich die Frage beantwortet? Die folgenden Best Practices reduzieren jedoch lästige und schwer nachzuvollziehende Fehler im Code, was dem OP möglicherweise helfen würde, diesen Fehler von vornherein zu vermeiden. – mrfreester

+1

@mrfreester Ich denke, es gibt Dinge in OP-Funktion, die nicht in der Frage enthalten sind, sonst ist die Funktion nicht das Problem, er ist in einem Null WebElement übergeben. Ich schlug Korrekturen für andere Dinge vor, die nicht verlangt wurden, aber wenn er nur den einfachen Code verwendet, den ich in zwei Zeilen bereitgestellt habe, sollte das das leere WebElement beheben. Wenn das Element nicht gefunden wird, führt dies zu einer weiteren Ausnahme, die dann zu dem Problem führen kann/sollte. Ich denke, es gibt keinen Code, der etwas mit dem Element macht und eine Nullreferenz zurückgibt. – JeffC

+0

@mrfreester Wenn ich raten sollte, isst er wahrscheinlich eine nicht gefundene Ausnahme in irgendeinem Code, der die Nullreferenz zurückgibt ... aber ... wir werden es nie erfahren, wenn er nicht den gesamten relevanten Code in der Frage – JeffC

0

Ein Konflikt zwischen der System.Debug und Nlog Bibliothek des Problem verursacht wurde, würde die Compiler die Assert Referenz in der System.Debug Bibliothek sehen, die im Gegenzug ein NullReferenceException werfen würden.

Verwandte Themen