2014-10-02 5 views
6

Mam problem z tym, że stażysta 2 musi czekać na obecność elementów. W aplikacji Intern 1 używam wait() do ustawiania okresów czasu, w których strona może oczekiwać na obecność elementu po wykonaniu czynności przez użytkownika. Z Intern 2 wydaje się być setFindTimeout(), co zawsze powinno oznaczać, że metoda find() musi trochę poczekać, aż element będzie obecny. Ustawiłem setFindTimeout() i próbowałem użyć pollUntil do obsługi tych oczekiwań, ale testy nadal nie działają z błędem "element niewidoczny".setFindTimeout i pollUntil z programem Intern dla elementów, które nie są widoczne przy ładowaniu strony początkowej

Oto przykładowy test, który wykorzystuje te same wymagania co moje prawdziwe testy i poszukuje identyfikatora elementu, który pojawia się 5 sekund po załadowaniu tego page.

define([ 
'intern!object', 
'intern/chai!assert', 
'require', 
'tests/util', 
'intern/dojo/node!leadfoot/Command', 
'intern/dojo/node!leadfoot/Session', 
'intern/dojo/node!leadfoot/helpers/pollUntil' 
], function (registerSuite, assert, require, util, Command, Session, pollUntil) { 

registerSuite([ 
    { 
     name: 'testing_find_by_wait', 

     test_create_form_on_web: function() { 
      console.log('Create a form with account, number, number and formula fields') 

      return this.remote 
       .setFindTimeout(10000) 
       .setWindowSize(1280, 960) 
       .get("http://www.kgstew.com/waittest.html") 
       .then(pollUntil('return document.getElementById("demo")', 10000)) 
       .findById('demo') 
        .click() 
        .end() 

     } 
    } 
]); 
}); 
+0

Jaki jest faktyczny błąd i z której linii? –

+0

Błąd to element "ElementNotVisible: [POST http://10.0.1.34:4444/wd/hub/session/204fe805-74f6-401d-a22f-5afd976b547c/element/9/click] element niewidoczny" na linii 29 – kgstew

+0

Kiedy przebiegi testowe nie wydaje się, że czekają co najmniej 10 sekund, zanim stwierdzi, że element nie jest widoczny. Rozumiem, że właśnie to powinno robić 'setFindTimeout()'. – kgstew

Odpowiedz

2

Dziękuję C Snover za pomoc w opracowaniu tego.

Nie zrozumiałem, jak działały setFindTimeout() i pollUntil. Obaj szukają elementów, które będą obecne w DOM (które były), ale jeśli element nie jest widoczny (tj. Styl jest display:none) po wydaniu polecenia click(), test się nie powiedzie.

Chcieliśmy poczekać, aż element pojawi się po wykonaniu jakiegoś działania użytkownika. Wpadł na pomysł z C Snover, aby obejrzeć element.offsetWidth, aby był większy niż 0.

W naszym pakiecie testowym stworzyliśmy następujące narzędzie.

element_visible_by_class: function(elem) { 
    return function(elem) { 
     elem = document.getElementsByClassName(elem); 
     if (!elem || elem.length == 0) { return null; } 
     elem = elem[0]; 
     return (elem.offsetWidth > 0 && elem.offsetHeight > 0) ? elem : null; 
    } 
}, 

Teraz z każdego testu można nazwać .then(pollUntil(util.element_visible_by_class(), ['class_name'], 10000)) i będzie czekać, aż ten element jest widoczny na stronie.

2

Element jest wykrywany dobrze. Zgodnie z błędem, nie można uzyskać elementu click. Dzieje się tak, ponieważ element jest pusty i nie ma stylu, więc ma zerowy rozmiar i nie można go kliknąć w momencie, gdy próbujesz go kliknąć. Musisz poczekać, aż element będzie istnieć i będzie widoczny, zanim będziesz mógł go kliknąć.

+0

Zgadzam się i użyłem 'setFindTimeout()' oraz pomocnika 'pollUntil', aby spróbować osiągnąć to oczekiwanie, zamiast ustawiać jawne' sleep() '. Rozumiem, że 'setFindTimeout' powinien ustawić czas, w którym każda metoda' find() 'powinna odczekać przed przejściem. Czy nie używam poprawnie tych metod oczekiwania i pomocników? – kgstew

+0

Czy to oznacza, że ​​aplikacja internetowa powinna zostać zmodyfikowana, aby ustawić niektóre właściwości okna po zakończeniu wywołań asynchronicznych, aby te właściwości mogły być odpytywane za pomocą ankiety? – KiaMorot

Powiązane problemy