2014-09-04 8 views
6

Ho un doppio cursore e mi piacerebbe testare che sia operativo e restituire i dati corretti. Il cursore ha un minimo e un gestore di massima, ma ha anche alcuni "punti di interruzione che posso gancio per."Come simulare un'azione drag and drop nel goniometro?

Quello che voglio simulare è

  • un TouchStart dell'elemento ".handler-max"
  • un movimento del pollice sopra l'elemento con classe dell'elemento

mentre ho trovato il modo per innescare un TouchStart e touchEnd ".step-3"

  • un touchEnd del" .handler-max" evento. Sono senza tracce su come simulare il movimento del pollice

    browser.executeScript('angular.element(arguments[0]).triggerHandler("touchstart");', filterHandler); 
    // <--- move event???? 
    browser.executeScript('angular.element(arguments[0]).triggerHandler("touchend");', filterHandler); 
    

    P.S. Lo scopo di questa domanda è un test di integrazione che verifica se ciò che accade all'applicazione quando un utente interagisce con una direttiva a doppio cursore è il risultato auspicabile.

  • risposta

    13

    elem = elemento che si desidera spostare;

    target = Elemento in cui si desidera eliminare elem;

    Per WebdriverJS: -

    browser.driver.actions().dragAndDrop(elem,target).mouseUp().perform(); 
    

    Per goniometro: -

    browser.actions().dragAndDrop(elem,target).mouseUp().perform();(Protractor) 
    
    +1

    Testato, funziona per me –

    +1

    Come si dice in olandese, cammina come un treno ... –

    -2

    Con problemi come questo, isolare il codice aziendale (che in realtà fa qualcosa di utile con il trascinamento degli eventi di rilascio &) dall'interfaccia utente. In questo modo, posso assicurarmi che il codice di avviamento a trascinamento riempirà correttamente le strutture dati e posso assicurarmi che il codice di gestione delle cadute faccia la cosa giusta senza che in realtà debba avere qualcosa che invii un vero trascinamento degli eventi di rilascio &.

    In questo modo, il vero codice di gestione degli eventi è di appena 1-2 righe, quindi le probabilità che si interrompa sono molto, molto sottili. Inoltre, non vi è alcun motivo per testare il codice di trascinamento & del browser o del sistema operativo; questo codice dovrebbe funzionare

    +0

    il mio problema sembra essere esattamente questo https://github.com/angular/protractor/issues/160. Intendo dire che sto provando a testare l'integrazione tra una direttiva di slider e un modulo di ricerca che aggiorna effettivamente tutti i dati. Quello che voglio testare è questo. Io un utente interagisce con la direttiva slider. In realtà attiva la sequenza di eventi prevista dall'utente? –

    +0

    @AlexandrosSpyropoulos: Il tuo commento non ha senso per me. –

    +0

    Voglio dire che sto provando a testare l'integrazione tra una direttiva di slider e un modulo di ricerca che gestisce effettivamente gli eventi. Quello che voglio testare è questo. Se un utente interagisce con la direttiva slider. In realtà attiva la sequenza di eventi prevista dall'utente? Spero che abbia senso per voi. In effetti, provo un cursore che modifica i valori min/max e alcuni moduli che stanno facendo richieste a un servizio e visualizzano un elenco di dati. –

    4

    Ok, giocando, ho scoperto che ci sono modi migliori. probabilmente le fonti che stavo cercando prima erano obsolete. Il seguente script farà il trucco molto pulito e facile ...

    it('step : 6 : select star rating min === 1 and max === 2' , function (done) { 
    
        driver.actions() 
         .mouseDown(element(by.css('.filter-editorial-rating .ngrs-handle-max'))) 
         .mouseMove(element(by.css('.filter-editorial-rating .step-2'))) 
         .mouseUp() 
         .perform(); 
    
    
    element(by.css('.results-indicator')).getText() 
        .then(function (text) { 
         resultsB = parseInt (text.split(" ")[0]); 
         expect(resultsB).toBeLessThan(resultsA);        
         done(); 
        }); 
    }); 
    

    è possibile ottenere driver come questo ...

    browser.get(url); 
    var driver = browser.driver; 
    

    Acclamazioni

    6

    Questo è abbastanza semplice al giorno d'oggi:

    browser.actions().dragAndDrop(elem, target).perform(); 
    

    Dove dragAndDrop behind the scenes è mouseDown + mouseMove + mouseUp:

    /** 
    * Convenience function for performing a "drag and drop" manuever. The target 
    * element may be moved to the location of another element, or by an offset (in 
    * pixels). 
    * @param {!webdriver.WebElement} element The element to drag. 
    * @param {(!webdriver.WebElement|{x: number, y: number})} location The 
    *  location to drag to, either as another WebElement or an offset in pixels. 
    * @return {!webdriver.ActionSequence} A self reference. 
    */ 
    webdriver.ActionSequence.prototype.dragAndDrop = function(element, location) { 
        return this.mouseDown(element).mouseMove(location).mouseUp(); 
    }; 
    
    +0

    fantastico, vorrei votare se è stato verificato da qualcuno.Abbastanza difficile per me perché non sto lavorando più sul front end e non sono impostato con selenio atm –

    +0

    @AlexandrosSpyropoulos sicuro, posso verificare che funziona per me :) – alecxe

    +0

    haha, buono :) –

    0
     var plot0 = ptor.element(protractor.By.id('')); 
    
         ptor.driver.actions() 
    
         .dragAndDrop(plot0, {x: 200, y: 100}) 
    
         .mouseMove(plot0, {x: 200, y: 100}) // 200px from left, 200 px from top of plot0 
    
         .mouseDown() 
    
         .mouseMove({x: 600, y: 0}) // 600px to the right of current location 
    
         .perform(); 
    

    Questo funziona per me ragazzi. Il mio scenario è di trascinare una finestra di dialogo a comparsa che non ha un elemento di destinazione.

    +0

    Grazie! Ha funzionato come un fascino! –