2016-06-29 8 views
5

हम अपने यूआई आधारित परीक्षणों को स्वचालित करने के लिए सेलेनियम वेबड्राइवर का उपयोग करते हैं। हमारी चुनौतियों में से एक यह पता लगाने के लिए है कि पृष्ठ कब वास्तव में लोड हो रहा है, और कोणीय 1 भी उस संबंध में एक चुनौती थी। हम विशेष रूप से अगर कोणीय 1 किया जाता है पता लगाने के लिए कोड के इस टुकड़े को क्रियान्वित करने समाप्त हो गया:यह पता लगाना कि कोणीय 2 चल रहा है

if(typeof window.angular !== \"undefined\") 
{ 
    var injector = window.angular.element(\"*[ng-app]\").eq(0).injector(); 

    if(injector) 
    { 
    var $rootScope = injector.get(\"$rootScope\"); 
    var $http = injector.get(\"$http\"); 

    if($rootScope.$$phase === \"$apply\" || $rootScope.$$phase === \"$digest\" || $http.pendingRequests.length !== 0) 
    { 
     return false; 
    } 
    } 
} 

एप्लिकेशन है कि हम परीक्षण कर रहे हैं हाल ही में कोणीय 2 का उपयोग करने पर कोड स्निपेट के ऊपर समाप्त करने के लिए कोणीय 2 के लिए प्रतीक्षा नहीं करता । कोई सुझाव?

+0

वही विषय है: http://stackoverflow.com/questions/34731869/wait-for-angular-2-to-load-resolve-model-before-rendering-view-template और सबसे अच्छा जवाब http था: //stackoverflow.com/a/38212664/4019586 –

+0

क्या आप कृपया मुझे उदाहरण दे सकते हैं कि आपने AngularJS 1 के लिए उस कोड का उपयोग कैसे किया? – yuva

उत्तर

8

कोणीय 2 के मामले में, आप सभी कोणीय 2 क्षुधा की "testabilities" की stableness के लिए इंतजार करना चाहिए:

functions.waitForAllAngular2 = function(callback) { 
    try { 
    var testabilities = window.getAllAngularTestabilities(); 
    var count = testabilities.length; 
    var decrement = function() { 
     count--; 
     if (count === 0) { 
     callback(); 
     } 
    }; 
    testabilities.forEach(function(testability) { 
     testability.whenStable(decrement); 
    }); 
    } catch (err) { 
    callback(err.message); 
    } 
}; 

Taken from Protractor source code। प्रोटैक्टर WebDriverJS जावास्क्रिप्ट सेलेनियम बाइंडिंग के चारों ओर एक रैपर है; AngularJS अनुप्रयोगों का परीक्षण करने के लिए डिज़ाइन किया गया (न केवल, लेकिन के लिए सबसे उपयुक्त है)।

0

मैं जड़ घटक

@Component({ 
    selector: 'my-app', 
    ... 
}) 
export class AppComponent { 
    constructor(private renderer:Renderer, private elementRef:ElementRef){} 
    ngAfterViewInit() { 
    this.renderer.invokeElementMethod(this.elementRef.nativeElement, 
     'dispatchEvent', 
     [new CustomEvent('angular2-loaded', { bubbles: true })]); 
    } 
} 

में ngAfterViewInit() के भीतर से एक घटना का उत्सर्जन और फिर WebDriver का उपयोग कर इस घटना को सुनना।

+0

उपरोक्त में एक टाइपो है: कन्स्ट्रक्टर पैराम्स में, दूसरा पैरामीटर elementRef है लेकिन ngAfterViewInit() में आप elRef का उपयोग कर रहे हैं। वैसे भी, हमने परीक्षण मुख्य एनजी 2 घटक के तहत ऐप में इसे जोड़ने का प्रयास किया। फिर क्रोम कंसोल में हम अलर्ट करने के लिए एक सरल कॉलबैक में गुजरने वाले कोणीय 2-लोड की गई घटनाओं को सुनने के लिए पंजीकृत होते हैं। परीक्षण के तहत ऐप लोड किया गया और ... कुछ भी नहीं हुआ। – user1801355

+0

@ user1801355 संकेत के लिए धन्यवाद। मैं किसी भी तरह आपकी टिप्पणी चूक गया - तय। –

1

मैं एक कार्रवाई वर्ग जिसमें मैं कार्यों से बाहर ले जाने से पहले कोणीय के लिए इंतजार कर रहे थे लिख कर इस तय (क्लिक करें, भरने, चेक आदि) Paul Hammants ngWebDriver का उपयोग कर:

import com.paulhammant.ngwebdriver.NgWebDriver; 

public class ActionsWithWaits { 

private NgWebDriver ngdriver; 
private JavascriptExecutor js; 

public ActionsWithWaits(){ 
    WebDriver driver = getDriver(); 
    js = (JavascriptExecutor) driver; 
    driver.manage().timeouts().setScriptTimeout(9, TimeUnit.SECONDS); 
    ngdriver = new NgWebDriver(js); 
} 


public void waitForAngular(){ 
    ngdriver.waitForAngularRequestsToFinish(); 
} 

public void waitAndClick(WebElementFacade button){ 
    waitForAngular(); 
    button.click(); 
} 

public void waitAndFillIn(String text, WebElementFacade field){ 
    waitForAngular(); 
    field.type(text); 
} 

etc.. 

अब तुम सिर्फ उन कार्यों के बजाय का उपयोग कर सकते आप एक बात (=

1

अगर सब कोणीय Testabilities स्थिर रहे हैं की जाँच करने के @alecxe जवाब मैं जावास्क्रिप्ट एक लाइनर निम्नलिखित के साथ समाप्त हो गया का उपयोग के बारे में चिंता करने की ज़रूरत नहीं मानक सेलेनियम कार्रवाई की और

window.getAllAngularTestabilities().findIndex(x=>!x.isStable()) === -1 
संबंधित मुद्दे