0

我正在从事基于 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

轨迹轨迹:

   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 (aka WebDriver) 中的用户扩展的讨论,可以在此处此处找到,是否意味着我需要自己实现所有 SelBlocks 功能才能使它们在 WebDriver 中可用?

4

1 回答 1

0

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

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

我为每个我想要的 SelBlocks 命令定义了一个 CoreStep 类(以及那些我不需要的空存根类)并将它们注册在 NonReflectiveSteps 对象中(参见 HTML Runner)。我的 NextStepDecorator 被赋予了一个名为“NextBlockCommand”的 getter / 属性,它返回“GoToNextCommand”(按顺序)、“JumpToBlockStart”或“JumpToEndOfBlock”。CoreTestCase 对象在每个核心步骤执行后评估此返回值,并使用 BlockDefinitions 对象来决定接下来运行哪个核心步骤。

这无疑是一个非常粗略的草图。如果它太简短并且您对细节感兴趣,请询问。

于 2017-04-20T08:12:04.717 回答