在 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)
所以我去操作了login
、select
(通过删除 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 实例?的主要内容,如果未能解决你的问题,请参考以下文章
GroovyGroovy 脚本调用 ( Groovy 脚本中调用另外一个 Groovy 脚本 | 绑定作用域 binding 变量分析 | Binding 类 variables 成员分析 )