Including external file 'signalr.min.js' window is not defined

254 views Asked by At

Versions

  • OpenTest --version 1.2.2
  • ChromeDriver 85.0.4183.87

Including the external javascript files I require will always throw something like:

Caused by: java.lang.RuntimeException: Failed to evaluate JavaScript code at line number 1. The script content was: 
$include(["signalr.min.js", "signalr.tests.js"]);
...
Caused by: java.lang.RuntimeException: Failed to run script file signalr.min.js
...
Caused by: javax.script.ScriptException: ReferenceError: "window" is not defined in <eval> at line number 1

I followed the docs at:

But none of the combinations I tried seems to work, I guess I'm missing something :(

I have the actor.yml configured with the chrome web-driver like this:

# Selenium options
selenium:
    # seleniumServerUrl: http://127.0.0.1:9515
    desiredCapabilities:
        browserName: chrome
        chromeOptions:
            args: [ --start-maximized ]
    chromeDriverExePath: C:/Webdrivers/chromedriver.exe
    chromeDriverExeArgs: [--start-maximized, --ignore-certificate-errors, --disable-popup-blocking, --disable-extensions-file-access-check, "--test-name", "--disable-extensions", "--disable-notifications", "--disable-web-security", "--disable-prompt-on-repost", "--browser-test", "--dom-automation", "--enable-caret-browsing", "--expose-internals-for-testing", "--force-login-manager-in-tests" ]

An example of the test in question:

description: My Test
actors:
  - actor: ACTOR1
    segments:
      - segment: 1
        actions:
          - description: include external SignalR script files
            script: |
                $include(["signalr.min.js", "signalr.tests.js"]);

          - description: Initialize SignalR Connection
            action: org.getopentest.selenium.ExecuteScript
            args:
              scriptArgs: $data("config").webChatUrl + $data("config").apiV1SignalRChathub
              script: |
                var hubUrl = arguments[0];
                SignalRConnectionTest(hubUrl);

The signalr.min.js can be found at: https://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/3.1.7/signalr.min.js

1

There are 1 answers

0
WizxX20 On BEST ANSWER

So after a lot of trail and error I managed to get something working. I never got the script-includes working in OpenTest. I figure that is because there are issues when the browser is not opened (yet), and so the window will just be undefined. So basically you can only include scripts that do not use the DOM...

What I did, was create a "local" html page that runs some of the javascript, and call that page from the OpenTest yml with some checks. here is an example of what I did:

description: My Test
actors:
  - actor: ACTOR1
    segments:
      - segment: 1
        actions:
          - description: Initialize Browser
            action: org.getopentest.selenium.NavigateTo
            args:
              url: $data("config").someExternalUrlIsAlive
              
          - description: Get Test Page File-Path
            script: |
              var File = Java.type("java.io.File");
              var URLEncoder = Java.type("java.net.URLEncoder");
              var StandardCharsets = Java.type("java.nio.charset.StandardCharsets");

              var testPage = new File("..\\test-repo\\scripts\\testpage.html");
              var testPageUrl = testPage.getAbsolutePath();

              var argument = $data("config").someProperty;
              var argumentUrlEncoded = URLEncoder.encode(argument, StandardCharsets.UTF_8.toString());

              $sharedData.testpage = testPageUrl + "?arg=" + argumentUrlEncoded;
              $log("The test-page path is " + $sharedData.testpage);

          - description: Navigate to Test Page
            action: org.getopentest.selenium.NavigateTo
            args:
              url: $sharedData.testpage

          - description: Start Test
            action: org.getopentest.selenium.Click
            args:
              locator: { id: btnTest }

          - description: Give the test some time to complete
            script: |
              var Thread = Java.type("java.lang.Thread");
              Thread.sleep(3000); // sleep 3 seconds.

          - description: Read Test Page Result
            action: org.getopentest.selenium.GetElements
            args:
              locator: { id: txtResult }
              $localData:
                resultElements: $output.elements

          - description: Validate the Test Page Results
            script: |
              var txtResult = $localData.resultElements[0];
              var testResult = txtResult.getAttribute("value")

              if (testResult !== "200") {
                $fail(
                  $format(
                    "We expected a valid connection result, but we got: {0}",
                    testResult
                  )
                );
              }