'Gatling script throws an error "type mismatch"

I have a problem with my script, I converted it from HAR file and divide it to two separate execs as below. I believe I did it properly (but I'm not 100% sure)

import scala.concurrent.duration._

import io.gatling.core.Predef._
import io.gatling.http.Predef._
import io.gatling.core.structure.{ChainBuilder, ScenarioBuilder}
import io.gatling.commons.validation._

class logingood extends Simulation {

    val httpProtocol = http
        .baseUrl("https://webapi.wage.iteodev.com")
        .inferHtmlResources()
        .userAgentHeader("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36")
        .proxy(Proxy("localhost", 8888).httpsPort(8888))

    val headers_0 = Map(
        "Accept" -> "application/json, text/plain, */*",
        "Origin" -> "https://frontend.iteodev.com",
        "Sec-Fetch-Mode" -> "cors")

    val headers_1 = Map(
        "Access-Control-Request-Headers" -> "authorization",
        "Access-Control-Request-Method" -> "GET",
        "Origin" -> "https://frontend.iteodev.com",
        "Sec-Fetch-Mode" -> "cors")

    val headers_2 = Map(
        "Accept" -> "application/json, text/plain, */*",
        "Origin" -> "https://frontend.iteodev.com",
        "Sec-Fetch-Mode" -> "cors",
        "authorization" -> "Bearer ${authToken}")
        

    val headers_3 = Map("Sec-Fetch-Mode" -> "no-cors")

    val headers_7 = Map(
        "Origin" -> "https://frontend.iteodev.com",
        "Sec-Fetch-Mode" -> "cors",
        "content-type" -> "application/x-www-form-urlencoded; charset=UTF-8")
    
    val uri1 = "https://api.wage.iteodev.com/signalr"
    val uri2 = "https://frontend.iteodev.com/static/media/download-app-headline.a2c2b312.svg"

val scn = scenario("logingood")
        .exec(http("request_0")
            .post("/api/oauth/token")
            .headers(headers_0)
            .formParam("username", "[email protected]")
            .formParam("password", "Zaq1@wsx")
            .formParam("grant_type", "password")
            .check(jsonPath("$..access_token").exists.saveAs("authToken"))
            .resources(http("request_1")
            .options("/api/account")
            .headers(headers_1),
            http("request_2")
            .get("/api/account")
            .headers(headers_2),
            http("request_3")
            .get(uri2)
            .headers(headers_3),
            http("request_4")
            .options("/api/conversations/")
            .headers(headers_1),
            http("request_5")
            .get("/api/conversations/")
            .headers(headers_2),
            http("request_6")
            .options("/api/notifications")
            .headers(headers_1)))
           
        .exec(http("request_7")
            .get(uri1 + "/negotiate?clientProtocol=1.5&Authorization=Bearer%20${authToken}&connectionData=%5B%7B%22name%22%3A%22livechat%22%7D%5D")
            .headers(headers_7),
            http("request_8")
            .get("/api/notifications")
            .headers(headers_2),
            http("request_9")
            .get(uri1 + "/start?transport=serverSentEvents&clientProtocol=1.5&Authorization=Bearer%20${authToken}&connectionToken=${MyConnectionToken}&connectionData=%5B%7B%22name%22%3A%22livechat%22%7D%5D")
            .headers(headers_7))   
                

    setUp(scn.inject(atOnceUsers(1))).protocols(httpProtocol)
}

But Gatling throws error

GATLING_HOME is set to "C:\Gatling"
JAVA = ""C:\Program Files\Java\jdk-12\\bin\java.exe""
10:28:27.322 [ERROR] i.g.c.ZincCompiler$ - C:\Gatling\user-files\simulations\logingood.scala:74:21: type mismatch;
 found   : io.gatling.http.request.builder.HttpRequestBuilder
 required: io.gatling.core.structure.Execs[_]
            .headers(headers_7),
                    ^
10:28:27.325 [ERROR] i.g.c.ZincCompiler$ - C:\Gatling\user-files\simulations\logingood.scala:77:21: type mismatch;
 found   : io.gatling.http.request.builder.HttpRequestBuilder
 required: io.gatling.core.structure.Execs[_]
            .headers(headers_2),
                    ^
10:28:27.326 [ERROR] i.g.c.ZincCompiler$ - C:\Gatling\user-files\simulations\logingood.scala:80:21: type mismatch;
 found   : io.gatling.http.request.builder.HttpRequestBuilder
 required: io.gatling.core.structure.Execs[_]
            .headers(headers_7))
                    ^
10:28:27.371 [ERROR] i.g.c.ZincCompiler$ - three errors found
10:28:27.378 [ERROR] i.g.c.ZincCompiler$ - Compilation crashed
sbt.internal.inc.CompileFailed: null
        at sbt.internal.inc.AnalyzingCompiler.call(AnalyzingCompiler.scala:253)
        at sbt.internal.inc.AnalyzingCompiler.compile(AnalyzingCompiler.scala:122)
        at sbt.internal.inc.AnalyzingCompiler.compile(AnalyzingCompiler.scala:95)
        at sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$4(MixedAnalyzingCompiler.scala:91)
        at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
        at sbt.internal.inc.MixedAnalyzingCompiler.timed(MixedAnalyzingCompiler.scala:186)
        at sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$3(MixedAnalyzingCompiler.scala:82)
        at sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$3$adapted(MixedAnalyzingCompiler.scala:77)
        at sbt.internal.inc.JarUtils$.withPreviousJar(JarUtils.scala:215)
        at sbt.internal.inc.MixedAnalyzingCompiler.compileScala$1(MixedAnalyzingCompiler.scala:77)
        at sbt.internal.inc.MixedAnalyzingCompiler.compile(MixedAnalyzingCompiler.scala:146)
        at sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1(IncrementalCompilerImpl.scala:343)
        at sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1$adapted(IncrementalCompilerImpl.scala:343)
        at sbt.internal.inc.Incremental$.doCompile(Incremental.scala:120)
        at sbt.internal.inc.Incremental$.$anonfun$compile$4(Incremental.scala:100)
        at sbt.internal.inc.IncrementalCommon.recompileClasses(IncrementalCommon.scala:180)
        at sbt.internal.inc.IncrementalCommon.cycle(IncrementalCommon.scala:98)
        at sbt.internal.inc.Incremental$.$anonfun$compile$3(Incremental.scala:102)
        at sbt.internal.inc.Incremental$.manageClassfiles(Incremental.scala:155)
        at sbt.internal.inc.Incremental$.compile(Incremental.scala:92)
        at sbt.internal.inc.IncrementalCompile$.apply(Compile.scala:75)
        at sbt.internal.inc.IncrementalCompilerImpl.compileInternal(IncrementalCompilerImpl.scala:348)
        at sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileIncrementally$1(IncrementalCompilerImpl.scala:301)
        at sbt.internal.inc.IncrementalCompilerImpl.handleCompilationError(IncrementalCompilerImpl.scala:168)
        at sbt.internal.inc.IncrementalCompilerImpl.compileIncrementally(IncrementalCompilerImpl.scala:248

        at sbt.internal.inc.IncrementalCompilerImpl.compile(IncrementalCompilerImpl.scala:74)
        at io.gatling.compiler.ZincCompiler$.doCompile(ZincCompiler.scala:210)
        at io.gatling.compiler.ZincCompiler$.delayedEndpoint$io$gatling$compiler$ZincCompiler$1(ZincCompiler.scala:215)
        at io.gatling.compiler.ZincCompiler$delayedInit$body.apply(ZincCompiler.scala:39)
        at scala.Function0.apply$mcV$sp(Function0.scala:39)
        at scala.Function0.apply$mcV$sp$(Function0.scala:39)
        at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:17)
        at scala.App.$anonfun$main$1$adapted(App.scala:80)
        at scala.collection.immutable.List.foreach(List.scala:392)
        at scala.App.main(App.scala:80)
        at scala.App.main$(App.scala:78)
        at io.gatling.compiler.ZincCompiler$.main(ZincCompiler.scala:39)
        at io.gatling.compiler.ZincCompiler.main(ZincCompiler.scala)
Java HotSpot(TM) 64-Bit Server VM warning: Ignoring option AggressiveOpts; support was removed in 12.0
Choose a simulation number:

What I did wrong? On many examples it looks similar and it works properly. I searched whole internet and didn't find any solution.



Solution 1:[1]

exec takes either an action, a chain, or a vararg of Execs.

in the block containing request7, you've got an exec where you're trying to pass what looks like a vararg of httpRequrestBuilders.

so instead of

.exec(http("request_7")
  .get(uri1 + "/negotiate?clientProtocol=1.5&Authorization=Bearer%20${authToken}&connectionData=%5B%7B%22name%22%3A%22livechat%22%7D%5D")
  .headers(headers_7),
  http("request_8")
    .get("/api/notifications")
    .headers(headers_2),
  http("request_9")
    .get(uri1 + "/start?transport=serverSentEvents&clientProtocol=1.5&Authorization=Bearer%20${authToken}&connectionToken=${MyConnectionToken}&connectionData=%5B%7B%22name%22%3A%22livechat%22%7D%5D")
    .headers(headers_7))

you need to either make them all Execs, or chain them

.exec(
  exec(http("request_7")
        .get(uri1 + "/negotiate?clientProtocol=1.5&Authorization=Bearer%20${authToken}&connectionData=%5B%7B%22name%22%3A%22livechat%22%7D%5D")
        .headers(headers_7)),
  exec(http("request_8")
        .get("/api/notifications")
        .headers(headers_2)),
  exec(http("request_9")
        .get(uri1 + "/start?transport=serverSentEvents&clientProtocol=1.5&Authorization=Bearer%20${authToken}&connectionToken=${MyConnectionToken}&connectionData=%5B%7B%22name%22%3A%22livechat%22%7D%5D")
        .headers(headers_7)))

I'm guessing the first exec in your snippet works as all the requests other than the first are done as resources

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 James Warr