applitools / Eyes.Selenium.JavaScript

Applitools Eyes SDK For Selenium JavaScript WebDriver
Other
18 stars 18 forks source link

"ElementArrayFinderWrapper is not a constructor" when calling element.all #22

Closed kylezeeuwen closed 7 years ago

kylezeeuwen commented 7 years ago

While using eyes in protractor tests, when I call element.all I get this error:

TypeError: ElementArrayFinderWrapper is not a constructor
    at Function.global.element.all (/Users/kyle/projects/numbers/rhtmlPictographs/node_modules/eyes.selenium/src/Eyes.js:177:36)
    at browser.get.then (/Users/kyle/projects/numbers/rhtmlPictographs/build/scripts/simpleBug.js:25:22)
    at ManagedPromise.invokeCallback_ (/Users/kyle/projects/numbers/rhtmlPictographs/node_modules/selenium-webdriver/lib/promise.js:1379:14)
    at TaskQueue.execute_ (/Users/kyle/projects/numbers/rhtmlPictographs/node_modules/selenium-webdriver/lib/promise.js:2913:14)
    at TaskQueue.executeNext_ (/Users/kyle/projects/numbers/rhtmlPictographs/node_modules/selenium-webdriver/lib/promise.js:2896:21)
    at asyncRun (/Users/kyle/projects/numbers/rhtmlPictographs/node_modules/selenium-webdriver/lib/promise.js:2775:27)
    at /Users/kyle/projects/numbers/rhtmlPictographs/node_modules/selenium-webdriver/lib/promise.js:639:7
    at process._tickCallback (internal/process/next_tick.js:103:7)
.

Here is a sample test file that will reproduce the error (note you will need to add a key):

'use strict';

const _ = require('lodash');

const Eyes = require('eyes.selenium').Eyes;

const eyes = new Eyes();
eyes.setApiKey('INSERT KEY HERE');

describe('Take visual regression snapshots', function () {

  beforeEach(function () {
    browser.ignoreSynchronization = true;
  });

  it(`Has th bug`, function(done) {

    eyes.open(
      browser,
      'simple bug example',
      'element.all busted'
    );

    browser.get('https://github.com/applitools/Eyes.Selenium').then( () => {
      return element.all(by.css('div')).each(function(element) {
        console.log(`will not get here`);
      });
    }).then( () => {
      console.log(`done taking snapshots`);
      eyes.close(false);
      done();
    }).catch( (error) => {
      console.log('test error:');
      console.log(error);
      eyes.close(false);
      done();
    })
  })
});

and here is my protractor config in case there is anything relevant in the protractor setup:

exports.config = {
  capabilities: {
    'browserName': 'chrome'
  },
  baseUrl: 'http://localhost:9000',
  jasmineNodeOpts: {
    showColors: true,
    defaultTimeoutInterval: 240000
  }
}

I was able to fix the issue by making two one line updates to your code:

(NB some editing for clarity)
$ diff -ur node_modules/eyes.selenium/src/ ../eyes.selium.fixed/src/
+++ /src/ElementArrayFinderWrapper.js

@@ -48,7 +48,7 @@
             return originalFn.apply(that._arrayFinder).then(function (arr) {
                 var list = [];
                 arr.forEach(function (finder) {
-                    list.push(new ElementFinderWrapper(finder, that._eyesDriver, that._logger));
+                    list.push(new ElementFinderWrapper.ElementFinderWrapper(finder, that._eyesDriver, that._logger));
                 });
                 return list;
             });

+++ ../eyes.selium.fixed/src/ElementFinderWrapper.js
@@ -91,4 +91,5 @@
     };

     exports.ElementFinderWrapper = ElementFinderWrapper;
+    exports.ElementArrayFinderWrapper = ElementArrayFinderWrapper.ElementArrayFinderWrapper;
 }());

Versions:

node version: v6.9.5 eyes.selenium version: 0.0.57 eyes: 0.1.8 eyes.sdk: 0.0.51 eyes.utils: 0.0.20 protractor: 4.0.14

kylezeeuwen commented 7 years ago

Line 41 of ElementArrayFinderWrapper also needs an update of a similar nature to the above

manuel-sanchez commented 7 years ago

We are also experiencing this very same issue

danielputerman commented 7 years ago

Thanks for the feedback! We will check and update asap.