0

Ich arbeite an einem Selenium-basierten Browser-Automatisierungsprojekt, bei dem einige nicht-programmierende Benutzer Testfälle in Selenium IDE definieren, denen wir dann einige benutzerdefinierte Logik hinzufügen und unsere benutzerdefinierte Anwendung durchlaufen. Unsere Anwendung ist in C# geschrieben, funktioniert aber grundsätzlich ähnlich wie die Java-Anwendung Selenium HTML Runner.Wie man Selen SelBlocks in ein Selen-basiertes C# -Projekt einbaut?

Jetzt schlagen wir den Punkt, wo wir Schleifen in unserem Testfälle benötigt, so dass wir die SelBlocks Plugins in Selenium IDE installiert. Damit dies auch in unserer benutzerdefinierten Anwendung funktioniert, hoffe ich, dass wir die Datei "SelBlocks user extension JS" (von hier https://raw.githubusercontent.com/refactoror/SelBlocks/master/user-extensions.js) verwenden können.

Allerdings konnte ich nicht diese Arbeit mit WebDriverBackedSelenium bekommen und die ChromeDriver wir verwenden. Wenn ich ExecuteScript() für mein WebDriverBackedSelenium-Objekt verwende, erhalte ich eine UnsupportedOperationException. (Der Start() Methode für das Objekt wurde vor genannt!) Nach der API-Beschreibung dieses wie der am besten geeignete Ansatz klang global für den SelBlocks JavaScript-Code registriert:

_selenium.AddScript(selBlocksScript, "selBlocks"); // throws UnsupportedOperationException 

Die Strack Spur:

bei Selenium.WebDriverCommandProcessor.Execute(String commandName, String[] args) 
    bei Selenium.WebDriverCommandProcessor.DoCommand(String command, String[] args) 
    bei RHoDOS.CoreTestCase.Run(TestState state, Results results, IWebDriver driver) in D:\NB00382\Documents\Visual Studio 2015\Projects\RHoDOS-Dev1\RHoDOS\CoreTestCase.cs:Zeile 86. 
    bei RHoDOS.HtmlLauncher.LaunchHtmlTest(String testTitle, String filepath, WebDriverBackedSelenium selenium, IWebDriver driver, Results results) in D:\NB00382\Documents\Visual Studio 2015\Projects\RHoDOS-Dev1\RHoDOS\HtmlLauncher.cs:Zeile 71. 
    bei RHoDOS.HtmlLauncher.RunHtmlSuite(String filepath) in D:\NB00382\Documents\Visual Studio 2015\Projects\RHoDOS-Dev1\RHoDOS\HtmlLauncher.cs:Zeile 110. 
    bei RHoDOS.Program.Main(String[] args) in D:\NB00382\Documents\Visual Studio 2015\Projects\RHoDOS-Dev1\RHoDOS\Program.cs:Zeile 36. 
    bei System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
    bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
    bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
    bei System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    bei System.Threading.ThreadHelper.ThreadStart() 

ich habe dann versucht ExecuteScript auf meinem ChromeDriver Objekt zu verwenden (das ist ein weniger geeigneter Ansatz ist, weil es das Skript im Kontext der aktuell geladenen Webseite ausführen würde, so dass ich nehme an, ich würde es immer wieder anrufen muß, jedes Mal, bevor ich eine SelBlocks-Erweiterungsmethode verwende).

Der Aufruf sieht wie folgt aus:

((IJavaScriptExecutor)driver).ExecuteScript(selBlocksScript, null); 

Der Chrome-Browser gibt die Meldung, dass die LOG Objekt unbekannt ist. Hier ist der Stack-Trace:

bei OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError(Response errorResponse) in C:\Users\U0558\Downloads\selenium-master\selenium-master\dotnet\src\webdriver\Remote\RemoteWebDriver.cs:Zeile 1271. 
    bei OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute, Dictionary`2 parameters) in C:\Users\U0558\Downloads\selenium-master\selenium-master\dotnet\src\webdriver\Remote\RemoteWebDriver.cs:Zeile 1070. 
    bei OpenQA.Selenium.Remote.RemoteWebDriver.ExecuteScriptCommand(String script, String commandName, Object[] args) in C:\Users\U0558\Downloads\selenium-master\selenium-master\dotnet\src\webdriver\Remote\RemoteWebDriver.cs:Zeile 1154. 
    bei OpenQA.Selenium.Remote.RemoteWebDriver.ExecuteScript(String script, Object[] args) in C:\Users\U0558\Downloads\selenium-master\selenium-master\dotnet\src\webdriver\Remote\RemoteWebDriver.cs:Zeile 520. 
    bei RHoDOS.CoreTestCase.Run(TestState state, Results results, IWebDriver driver) in D:\NB00382\Documents\Visual Studio 2015\Projects\RHoDOS-Dev1\RHoDOS\CoreTestCase.cs:Zeile 87. 
    bei RHoDOS.HtmlLauncher.LaunchHtmlTest(String testTitle, String filepath, WebDriverBackedSelenium selenium, IWebDriver driver, Results results) in D:\NB00382\Documents\Visual Studio 2015\Projects\RHoDOS-Dev1\RHoDOS\HtmlLauncher.cs:Zeile 71. 
    bei RHoDOS.HtmlLauncher.RunHtmlSuite(String filepath) in D:\NB00382\Documents\Visual Studio 2015\Projects\RHoDOS-Dev1\RHoDOS\HtmlLauncher.cs:Zeile 110. 
    bei RHoDOS.Program.Main(String[] args) in D:\NB00382\Documents\Visual Studio 2015\Projects\RHoDOS-Dev1\RHoDOS\Program.cs:Zeile 36. 
    bei System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
    bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
    bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
    bei System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    bei System.Threading.ThreadHelper.ThreadStart() 

Wie soll ich vorgehen, die SelBlocks Skript (oder Benutzer-Erweiterungen im Allgemeinen) zu einem angepassten Selen WebDriver Projekt hinzufügen? Oder bedeutet die Diskussion über Benutzererweiterungen in Selenium 2 (alias WebDriver), wie sie here oder here sind, dass ich alle SelBlocks-Funktionen selbst implementieren muss, um sie in WebDriver verfügbar zu machen?

Antwort

0

Der Ansatz mit benutzerdefinierten Java Script-Erweiterungen funktioniert nicht mehr in WebDriver. Also habe ich alle benötigten Funktionen des SelBlocks-Plugins in meiner eigenen Anwendung implementiert, die mit dem HTML-Runner des Selenium-Projekts HTML Runner on Github vergleichbar ist. Hier ist eine grobe Skizze, wie dies erreicht werden könnte, vorausgesetzt, die Vertrautheit mit den Klassen HTML Runner sowie den SelBlocks JavaScript-Code:

ich eine BlockDefinition Klasse geschrieben, die in der SelBlocks js die gleichen Informationen wie das blockDefs Objekt hält (dh Indizes für Anfangs- und Endpositionen bestimmter Blöcke). Die CoreTestCase-Klasse (aus HTML-Runner) wurde erweitert, um ein Objekt der BlockDefinition-Klasse zu instanziieren und den Selenium-Testfall HTML zu kompilieren (vgl. Funktion compileSelBlocks() in den SelBlocks js). Die BlockDefinitions werden in das TestState-Objekt geschrieben, sodass sie für jedes CoreStep-Objekt zugänglich sind.

Ich definierte eine CoreStep-Klasse für jeden gewünschten SelBlocks-Befehl (und leere Stub-Klassen für diejenigen, die ich nicht brauche) und registrierte sie im NonReflectiveSteps-Objekt (vgl. HTML-Runner). Mein NextStepDecorator hat eine get/property namens "NextBlockCommand" erhalten, die entweder "GoToNextCommand" (in Folge), "JumpToBlockStart" oder "JumpToEndOfBlock" zurückgibt.Das CoreTestCase-Objekt wertet diesen Rückgabewert nach jeder Ausführung des Kernschritts aus und entscheidet anhand des Objekts BlockDefinitions, welcher Kernschritt als nächstes ausgeführt werden soll.

Dies ist zugegebenermaßen eine sehr grobe Skizze. Wenn es zu kurz ist und Sie sich für die Details interessieren, fragen Sie einfach.

Verwandte Themen