2014-11-24 15 views
7

Una delle nostre applicazioni interne (scritto in angularjs) ha una speciale finestra di errore che compare se JavaScript è disabilitato nel browser (utilizzando noscript), simile a quello su StackOverflow:test Selenium WebDriver con JavaScript disabilitato

enter image description here Sto provando a scrivere un test automatico, ma con difficoltà.

Stiamo usando protractor, ma sono abbastanza sicuro che non si tratta di questo. Ecco il file di configurazione goniometro:

'use strict'; 

var helper = require('./helper.js'); 

exports.config = { 
    seleniumAddress: 'http://localhost:4444/wd/hub', 
    baseUrl: 'http://localhost:9001', 

    capabilities: helper.getFirefoxProfile(), 

    framework: 'jasmine', 
    allScriptsTimeout: 20000, 

    jasmineNodeOpts: { 
     showColors: true, 
     isVerbose: true, 
     includeStackTrace: true 
    } 
}; 

dove helper.js è:

var q = require('q'); 
var FirefoxProfile = require('firefox-profile'); 

exports.getFirefoxProfile = function() { 
    var deferred = q.defer(); 

    var firefoxProfile = new FirefoxProfile(); 
    firefoxProfile.setPreference("javascript.enabled", false); 
    firefoxProfile.encoded(function(encodedProfile) { 
     var capabilities = { 
      'browserName': 'firefox', 
      'firefox_profile' : encodedProfile, 
      'specs': [ 
       '*.spec.js' 
      ] 
     }; 
     deferred.resolve(capabilities); 
    }); 

    return deferred.promise; 
}; 

Come vedete, stiamo allestendo javascript.enabled firefox preferenza ai false che è stato dimostrato di funzionare se si apre manualmente about:config in firefox, cambialo in false - vedresti il ​​contenuto della sezione noscript.

Ma, quando ho eseguito il test, sto ottenendo il seguente errore:

Exception thrown org.openqa.selenium.WebDriverException: waiting for evaluate.js load failed

Ecco il complete traceback.

FYI, selenio 2.44.0 e firefox 33.1.1 vengono utilizzati.

Per quanto ho capito (con l'aiuto di diversi punti sollevati here), disabilitando JavaScript sta uccidendo il javascript WebDriver sé. È vero? Se sì, quali sono le mie opzioni o soluzioni alternative?


Note:

  • in caso di Chrome, in passato è stato possibile disattivare JavaScript tramite --disable-javascript command-line argument, ma notanymore.

  • questo porta a una serie soluzione 0 - downgrade chrome a una vecchia versione che supportava il flag della riga di comando - questo sarebbe un piano non testato B

  • impostazione javascript.enabled=false firefox preferenza lavora con binding python selenio:

    from selenium import webdriver 
    
    profile = webdriver.FirefoxProfile() 
    profile.set_preference('javascript.enabled', False) 
    driver = webdriver.Firefox(firefox_profile=profile) 
    
    driver.get('https://my_internal_url.com') 
    # no errors and I can assert the error is present 
    

Sono aperto a qualsiasi suggerimento e in grado di fornire tutte le informazioni supplementari.

+1

Il fatto che sia possibile disattivare JavaScript e avere ancora il codice Python di lavoro mi suggerisce che disattivare JavaScript non sta uccidendo la parte di WebDriver che risiede all'interno del browser. Molto probabilmente gli errori che ricevi con JavaScript disabilitato sono dovuti a Protractor stesso o WebDriverJS. – Louis

+0

@Louis Non so come stai, ma sei riuscito ad aiutarmi ancora, il tuo commento mi ha fatto riflettere profondamente e mi ha spinto a scavare nel codice sorgente. Guarda la risposta per favore. Grazie. – alecxe

+0

Solo un ragionamento deduttivo e un sacco di tempo trascorso con il selenio. – Louis

risposta

2

Ecco cosa è successo in realtà.

Come risulta, dopo aver esplorato il codice sorgente di protractor e selenio js webdriver, il problema chiave non si trova nel js webdriver o protractor, era nel modo in cui il mio test è stato scritto.

C'è un'impostazione chiamata ignoreSynchronization che di default è false:

/** 
    * If true, Protractor will not attempt to synchronize with the page before 
    * performing actions. This can be harmful because Protractor will not wait 
    * until $timeouts and $http calls have been processed, which can cause 
    * tests to become flaky. This should be used only when necessary, such as 
    * when a page continuously polls an API using $timeout. 
    * 
    * @type {boolean} 
    */ 
    this.ignoreSynchronization = false; 

E non stava tramontando al true che ha reso protractor per provare la sincronizzazione con la pagina ed eseguire script lato client, che evaluate.js è responsabile per.

La soluzione era così semplice non potevo immaginare - solo impostando ignoreSynchronization al true risolto il problema:

'use strict'; 

require('jasmine-expect'); 

describe('Disabled Javascript', function() { 
    beforeEach(function() { 
     browser.ignoreSynchronization = true; 
     browser.get('index.html'); 
    }); 

    it('should show disabled js', function() { 
     var element = browser.findElement(by.tagName('noscript')); 
     expect(element.getText()).toEqual('Please enable Javascript and try again.'); 
    }); 
}); 

Spero che questo avrebbe aiutato qualcuno in futuro.

0

come per il tuo stacktrace, sembra che tu stia utilizzando ff 33.1 con selenio 2.43.1, quindi non supporta. Si prega di aggiornare la versione del selenio alla 2.44 per abilitare i test su ff-33.

+0

Questo potrebbe essere un problema, ma il selenio aggiornato a '2.44.0' - il problema persiste (aggiornato il traceback). Grazie. – alecxe

1

As far as I understand (with the help of several points raised here), disabling javascript is killing the javascript webdriver itself. Is it true?

Sì. Nota che WebDriver stesso funziona come un'estensione per Firefox, quindi il suo codice non è influenzato dalla disattivazione di JavaScript.Tuttavia, il messaggio di errore indica che Selenium sta tentando di eseguire codice nel contesto della pagina Web. Per questo inietta un tag <script> nella pagina Web e inserisce il contenuto di evaluate.js in esso. Quindi attende che lo script imposti un flag che indica che è pronto - qualcosa che non accade mai, naturalmente, perché gli script non sono in esecuzione in quella pagina web.

If yes, what are my options or workarounds?

L'importante questione è cosa il Selenium sta cercando di eseguire lì. Il tuo traceback sta semplicemente indicando che alcuni codici stanno chiamando executeScript() o executeAsyncScript(). Non sono riuscito a trovare alcuna chiamata implicita a nessuno dei due metodi nella base di codice Selenium (almeno non nei file relativi al driver Web di Firefox). Dato che Selenium è open source, dovresti essere in grado di eseguire il debug e aggiungere un punto di interruzione su org.openqa.selenium.remote.RemoteWebDriver.executeScript() e org.openqa.selenium.remote.RemoteWebDriver.executeAsyncScript() - in questo modo vedrai effettivamente lo script che viene eseguito lì. In alternativa, è anche possibile ricompilare RemoteWebDriver.java e produrre output di debug.

Guardando al modo in cui questi metodi sono implementati, potrebbe esserci anche un altro modo: dire al selenio che JavaScript è disabilitato. Questo dovrebbe funzionare tramite funzionalità:

'javascriptEnabled': false, 

Secondo la documentazione di questa funzionalità funziona solo su HTMLUnitDriver, eppure Selenio sarà sempre in considerazione e dal codice sorgente specificandolo per Firefox sembra possibile. Con questa funzionalità, tutte le chiamate che eseguono script nelle pagine Web falliranno presto.

0

Trovato una soluzione alternativa/soluzione alternativa - "NoScript Security Suite" firefox extension.

Disabilita javascript per dominio e, per impostazione predefinita, lo fa per tutti i siti tranne quelli elencati nella lista bianca. Questo fa girare il webdriver senza problemi, apre una pagina web, quindi l'estensione disabilita javascript per questo particolare sito e vedo il contenuto del tag noscript.

Ecco il config goniometro:

'use strict'; 

var helper = require('./disabledJavascript.helper.js'); 

exports.config = { 
    seleniumAddress: 'http://localhost:4444/wd/hub', 

    capabilities: helper.getFirefoxProfile(), 
    chromeOnly: false, 

    specs: [ 
     'disabledJavascript.spec.js' 
    ], 

    framework: 'jasmine', 

    allScriptsTimeout: 20000, 

    baseUrl: 'http://localhost:9001', 

    jasmineNodeOpts: { 
     showColors: true, 
     isVerbose: true, 
     includeStackTrace: true 
    } 
}; 

dove disabledJavascript.helper.js contiene:

'use strict'; 

var q = require('q'); 
var FirefoxProfile = require('firefox-profile'); 

exports.getFirefoxProfile = function() { 
    var deferred = q.defer(); 
    var firefoxProfile = new FirefoxProfile(); 

    firefoxProfile.addExtension('./test/e2e/disabledJavascript/noscript.xpi', function() { 
     firefoxProfile.encoded(function(encodedProfile) { 
      var capabilities = { 
       'firefox_profile' : encodedProfile, 
       'browserName': 'firefox' 
      }; 
      deferred.resolve(capabilities); 
     }); 
    }); 

    return deferred.promise; 
}; 

dove noscript.xpi è un'estensione scaricato "Noscript".

+0

Questa soluzione sembra negare il punto di test dato che avere l'estensione NoScript installata non è la stessa cosa dell'avere JavaScript disabilitato. Le differenze comportamentali sono davvero piuttosto significative. Non hai risposto ai miei suggerimenti, suppongo che la funzione 'javascriptEnabled' non abbia funzionato? –

+0

@WladimirPalant Concordo sul fatto che potrebbe esserci una differenza nel modo in cui javascript è disabilitato, potresti pensare a qualcosa di più di una soluzione reale - anche se nessuna altra opzione funzionava - non ho avuto fortuna ad impostare la preferenza 'javascriptEnabled', anche giocata con Opzione '--disable-javascript' chrome e vecchie versioni del browser chrome. Grazie. – alecxe

+0

Beh, potresti ancora eseguire il debug di Selenium - non è qualcosa che posso fare per te;) –

Problemi correlati