Selenium Grid总是执行我不想要的额外测试实例

时间:2017-10-02 16:41:14

标签: selenium gradle groovy selenium-grid selenide

背景

我设置了一个Selenium Grid项目,可以在两个不同的浏览器Chrome和Firefox中执行我的测试。我正在使用Gradle来执行我的测试。测试将成功执行两次,一次在Chrome中,一次在Firefox中,如预期的那样,然后第三个实例将在默认浏览器中执行并失败。

预期结果

  1. Chrome实例将会打开,规范将会运行,并且会通过。
  2. 将打开一个Firefox实例(使用geckodriver),规范将会运行,并且会通过。
  3. Gradle任务将成功完成。
  4. 实际结果

    1. Chrome实例将会打开,规范将会运行,并且会通过。
    2. 将打开一个Firefox实例(使用geckodriver),规范将会运行,并且会通过。
    3. 将打开一个新的Firefox实例(使用firefoxdriver),规范将无法运行,并且会失败。
    4. Gradle任务将失败,因为上次测试执行失败。
    5. 我的想法

      • 我之前遇到Gradle执行Spock测试两次的问题。为了解决这个问题,我不得不添加以下代码:

        test {
            actions = []
        }
        
      • 我还注意到,当我的Selenium测试再次执行时,它会使用默认的firefox驱动程序打开它,而不是geckomarionette驱动程序。

        • firefox驱动程序已旧,并且不支持最新版本的Firefox,但它的Selenium"默认"浏览器,如果您没有指定浏览器来执行测试。
      • 我设置了两个Selenium Grid节点,所以我想知道Gradle是否正在执行我的测试的第三个版本,但它与其中一个节点不匹配,但我只是告诉它进行两次测试。

      代码

      我创建了一个示例项目,可以在Bitbucket上重现此问题。有关如何运行样本测试的说明包含在自述文件中。

      作为一个片段,这是我的示例规范:

      class W3SchoolsFormExampleSpec extends Specification {
      
          def 'Test form submission is successful on W3Schools'() {
              when: 'Name info is submitted into the form'
                  open('https://www.w3schools.com/html/html_forms.asp')
      
                  $(byName('firstname')).setValue('Clark')
                  $(byName('lastname')).setValue('Kent')
      
                  $x('//*[@id="main"]/div[3]/div/form/input[3]').click()
      
              and: 'Switch to newly opened tab'
                  switchTo().window(1)
      
              then: 'New page should display the passed-in request params'
                  $x('/html/body/div[1]').shouldHave(text('firstname=Clark&lastname=Kent'))
          }
      }
      

      这是我build.gradle文件的摘录:

      test {
          // Prevent Gradle from strangely executing Spock tests twice
          actions = []
      }
      
      task testW3SchoolsForm(type: Test) {
          outputs.upToDateWhen { false }
      
          doFirst {
              // Check to see that the Selenium drivers are installed
              if (!file("C:/Selenium/chromedriver.exe").exists()) {
                  throw new GradleException(
                          'ERROR: Please install the web drivers in the correct location.'
                  )
              }
      
              // Register the hub
              GridLauncherV3.main('-role', 'hub')
      
              // Register the Chrome and Firefox nodes
              GridLauncherV3.main('-role', 'node',
                      '-browser', 'broswerName=chrome,platform=WINDOWS',
                      '-hub', 'http://localhost:4444/grid/register',
                      '-port', '4446'
              )
              GridLauncherV3.main('-role', 'node',
                      '-browser', 'broswerName=firefox,platform=WINDOWS',
                      '-hub', 'http://localhost:4444/grid/register',
                      '-port', '4446'
              )
          }
      }
      
      enum BrowserType {
          CHROME('chrome'),
          FIREFOX('gecko')
      
          def browserString
      
          BrowserType(browserString) {
              this.browserString = browserString
          }
      }
      
      BrowserType.values().each { browserType ->
          tasks.create("testW3SchoolsForm${browserType}", Test) {
              // Force the tests to run every time
              outputs.upToDateWhen { false }
      
              // Allow parallel execution
              maxParallelForks = 3
              forkEvery = 0
      
              def drivers = [
                      (BrowserType.CHROME): 'chromedriver.exe',
                      (BrowserType.FIREFOX): 'geckodriver.exe'
              ]
      
              def browserProperty = browserType.browserString
              def webdriverPath = file("C:/Selenium/${drivers[browserType]}")
      
              // Set the respective system properties for each browser
              systemProperties["webdriver.${browserProperty}.driver" as String] = webdriverPath
              systemProperties['selenide.browser'] = browserType.browserString
      
              filter {
                  include 'com/example/dummy/W3SchoolsFormExampleSpec.class'
              }
      
              testLogging {
                  events 'PASSED', 'FAILED', 'STARTED', 'SKIPPED'
              }
      
              testW3SchoolsForm.dependsOn "testW3SchoolsForm${browserType}"
          }
      }
      

      关于为什么第三个测试实例会在默认的Selenium浏览器中执行的任何想法?

1 个答案:

答案 0 :(得分:1)

经过几天的反复试验并通过Gradle forums发布解决方案后,我找出了原因,这可能有助于未来的读者。

创建自定义Test任务时要小心。

默认情况下,应用JavaGroovy插件会自动创建默认Test任务,该任务会执行test源目录下的所有测试。

通过执行以下操作创建自定义测试任务时:

task testABC(type: Test) {
    filter {
        include "ABCTest"
    }
}

...执行此测试任务也将执行默认的test任务。如果您希望禁用默认test任务的执行,请设置test.enabled = false