我们一直试图弄清楚如何调用,(0)从一个groovy脚本,(1)一个selenium网站登录,然后(2)调用导航(脚本)部分坐在另一个测试用例。独立运行100%。下面是我用来调用(0)中的两个脚本的代码,但是一旦用login.run
完成,就会打开一个新的浏览器select.run
,显然测试失败,因为它& #39;未登录。
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
脚本使用{{ 1}}来自主脚本(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独立服务器
答案 0 :(得分:2)
首先我要澄清几点。
groovy script
中定义的变量,无论Groovy脚本位于何处 soapui
使用StringToString Map
方式是什么:
默认情况下,Groovy Script可以访问以下变量:
- context - testRunner - log
所以,context
可以用来在一个地方初始化对象并在任何地方访问它。这取决于对象在哪个上下文中被初始化或设置,然而,在检索对象时使用相同的上下文。这样,Webdriver
实例只创建一次,并使用其他context
变量进行访问。
注意:首次访问对象之前必须先完成初始化。否则,它将以
结束NullpointerException
在这里,我想建议在Project level
设置所需的对象,以便在 soapUI项目中的任何位置都可以使用相同的对象。但是,它也不会阻止您使用测试套件/案例级别。
以下是first groovy script
中所需的其他声明。请在创建driver
对象后保留它。
设置/初始化驱动程序对象:
//your existing code goes here def projectContext = context.testCase.testSuite.project.context projectContext.driver = driver
获取/访问其他位置的驱动程序对象:
def projectContext = context.testCase.testSuite.project.context def driver = projectContext.driver //then use driver object below.