如何将Selenium SelBlocks插件整合到基于Selenium的自定义C#项目中?

时间:2017-02-06 09:06:43

标签: c# selenium selenium-webdriver selenium-chromedriver selblocks-plugin

我正在开发基于Selenium的浏览器自动化项目,其中一些非编程用户在Selenium IDE中定义测试用例,然后我们向自定义应用程序添加一些自定义逻辑并运行。我们的应用程序是用C#编写的,但基本上与Selenium HTML Runner java应用程序的工作方式类似。

现在我们在测试用例中需要循环,所以我们在Selenium IDE中安装了SelBlocks插件。为了使它也适用于我们的自定义应用程序,我希望我们可以使用SelBlocks用户扩展JS文件(从这里https://raw.githubusercontent.com/refactoror/SelBlocks/master/user-extensions.js)。

但是,我无法使用WebDriverBackedSelenium和我们正在使用的ChromeDriver。 如果我在WebDriverBackedSelenium对象上使用ExecuteScript(),则会收到UnsupportedOperationException。 (之前已经调用了对象的Start()方法!)根据API描述,这听起来像是全局注册SelBlocks JavaScript代码的最合适的方法:

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

Strack trace:

   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()

然后我尝试在我的ChromeDriver对象上使用ExecuteScript(这是一种不太合适的方法,因为它会在当前加载的网页的上下文中执行脚本,所以我想我必须一次又一次地调用它,每次我使用SelBlocks扩展方法之前)。

电话看起来像这样:

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

Chrome浏览器会返回LOG对象未知的消息。这是堆栈跟踪:

   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()

我应该如何继续将SelBlocks脚本(或一般用户扩展)添加到自定义的Selenium WebDriver项目中?或者在Selenium 2(又名WebDriver)中对用户扩展的讨论,如herehere,是否意味着我需要自己实现所有SelBlocks函数以使它们在WebDriver中可用?< / p>

1 个答案:

答案 0 :(得分:0)

使用自定义Java脚本扩展的方法不再适用于WebDriver。所以我确实在我自己的应用程序中实现了SelBlocks插件的所有必需功能,这与Selenium项目的HTML Runner HTML Runner on Github相当。 假设您熟悉HTML Runner类以及SelBlocks JavaScript代码,这里有一个关于如何实现这一目标的草图:

我编写了一个BlockDefinition类,它保存与SelBlocks js中的blockDefs对象相同的信息(即特定块的开始和结束位置的索引)。 CoreTestCase类(来自HTML runner)已经扩展为实例化BlockDefinition类的对象并编译Selenium测试用例HTML(参见SelBlocks js中的compileSelBlocks()函数)。 BlockDefinitions被写入TestState对象,因此每个CoreStep对象都可以访问它们。

我为我想要的每个SelBlocks命令定义了一个CoreStep类(并且为那些我不需要的空存根类),并在NonReflectiveSteps对象中注册它们(参见HTML Runner)。 我的NextStepDecorator被赋予了一个名为&#34; NextBlockCommand&#34;的getter / property,它返回&#34; GoToNextCommand&#34; (按顺序),&#34; JumpToBlockStart&#34;或&#34; JumpToEndOfBlock&#34;。 CoreTestCase对象在每个核心步骤执行后计算此返回值,并使用BlockDefinitions对象来决定下一个要运行的核心步骤。

这无疑是一个非常粗略的草图。如果它太简短而你对细节感兴趣,那就问问。