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

Passing the webdriver instance between groovy scripts?

我们一直在尝试找出如何调用,(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 class(0)

我也看过这些类似的问题,但我们的似乎与他们的不同。

selenium webdriver inside soapui, passing the driver instance

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

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

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

先明确几点。

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

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

- context
- testRunner
- log

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

Note: The initialization has to be done before accessing the object for the first time. Otherwise, it will end up with 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.