Search code examples
javascriptseleniumopentest

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


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


Solution

  • 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
                      )
                    );
                  }