在 groovy 脚本之间传递 webdriver 实例?

Posted

技术标签:

【中文标题】在 groovy 脚本之间传递 webdriver 实例?【英文标题】:Passing the webdriver instance between groovy scripts? 【发布时间】:2016-01-21 11:16:19 【问题描述】:

我们一直在试图弄清楚如何调用,(0)从一个 groovy 脚本,(1)一个 selenium 网站登录,然后(2)调用另一个测试用例中的导航(脚本)部分。两者独立运行 100%。下面是我用来从 (0) 调用这两个脚本的代码,但是,一旦使用 login.run 完成,就会使用 select.run 打开一个新浏览器,显然测试失败,因为它没有登录。

login = testRunner.testCase.testSuite.project.testSuites["Selenium"].testCases["Login"].testSteps["Login_Plat"]
select = testRunner.testCase.testSuite.project.testSuites["Selenium"].testCases["Calculator"].testSteps["GS_Platinum"]

login.run(testRunner, context)
select.run(testRunner, context)

所以我去操作了loginselect(通过删除 webdriver 代码),主脚本代码现在看起来像这样(我已经排除了此粘贴中的导入):

System.setProperty("webdriver.chrome.driver",testRunner.testCase.testSuite.getPropertyValue("driverPath"))
env = testRunner.testCase.testSuite.getPropertyValue("testEnvDetails1")
WebDriver driver = new ChromeDriver()

driver.get(env)

login = testRunner.testCase.testSuite.project.testSuites["Selenium"].testCases["Login"].testSteps["Login_Plat"]
select = testRunner.testCase.testSuite.project.testSuites["Selenium"].testCases["Calculator"].testSteps["GS_Platinum"]
login.run(testRunner, context)
select.run(testRunner, context)

我在失败的登录脚本(当我运行脚本 0 时)ERROR:groovy.lang.MissingPropertyException: No such property: driver for class: Script19 的错误日志中找到了这个,所以看起来 (1)login 脚本没有使用主脚本中的 driver 类(0)

我也看过这些类似的问题,但我们的问题似乎与他们的差异太大。

selenium webdriver inside soapui, passing the driver instance

How to pass context from Script to another Class groovy

How to define a global class in SoapUI as a groovy script?

我非常努力地避免 .jar 进入 ext 目录方式,仅仅是因为我们想不惜一切代价避免(主要是培训)使用另一个程序来做到这一点。如果我们可以看到代码被调用而不是在网站更改时将其导入脚本中,效率也会高得多。

这三个脚本都在同一个项目和测试套件中,但测试用例不同。这样做是因为登录测试用例中将有多个测试步骤/脚本,具有不同的登录方式和详细信息。我正在使用 webdriver 独立服务器

【问题讨论】:

当你说“我没有从运行的原始脚本中传递相同的驱动程序 - 我已经尝试在里面做所有的导入和驱动程序的东西主运行器脚本,只调用一般硒代码无济于事。”您能否编辑问题并澄清细节,例如主脚本的意思?您的测试用例/测试套件是如何定义的?你从soapUI 运行它的驱动程序是什么,而不是像command-line外部 使用它?你为什么要避免.jar @Rao 希望它更清楚? 【参考方案1】:

让我先澄清几点。

默认情况下,在一个groovy script 中定义的变量无法在第二个 groovy 脚本中访问 无论 groovy 脚本位于何处 由于soapui使用StringToString Map这一事实,无法使用属性[测试用例/套件/项目]来存储复杂对象

有什么办法: 默认情况下,Groovy 脚本可以访问以下变量:

- 语境 -testRunner - 日志

所以,context 您可以利用它在一个地方初始化对象并在任何地方访问它。这取决于对象在哪个上下文中被初始化或设置,不过要说,在检索对象时使用相同的上下文。这样,Webdriver 实例被创建一次并使用其他 context 变量访问。

注意:初始化必须在第一次访问对象之前完成。否则,它将以NullpointerException 结束

这里我想建议将所需的对象设置为Project level,以便在soapUI 项目 中的任何地方都可以使用相同的对象。但是,它也不会阻止您使用测试套件/案例级别。

以下是您的first groovy script需要的其他声明。请在driver 对象创建后保留。

设置/初始化驱动对象:

//你现有的代码放在这里 def projectContext = context.testCase.testSuite.project.context projectContext.driver = 驱动程序

在其他地方获取/访问驱动程序对象:

def projectContext = context.testCase.testSuite.project.context def driver = projectContext.driver //然后使用下面的驱动程序对象。

【讨论】:

谢谢@Rao,周末我在玩context 变量,但我让它比在每个脚本中添加两行代码复杂得多:) 简单通常是答案- 再次感谢您的精彩回答!

以上是关于在 groovy 脚本之间传递 webdriver 实例?的主要内容,如果未能解决你的问题,请参考以下文章

Groovy脚本将值传递给sh。脚本

如何捕获传递给 Groovy 脚本的参数?

避免在不同的 Groovy 脚本之间共享 Java 元类

GroovyGroovy 脚本调用 ( Groovy 脚本中调用另外一个 Groovy 脚本 | 绑定作用域 binding 变量分析 | Binding 类 variables 成员分析 )

如何将参数从Selenium Webdriver传递给JMeter?

Java执行groovy脚本的两种方式