2017-07-27 72 views
1

我正在使用量角器在我的Angular web應用上運行集成測試。我的網絡應用使用我自定義的Angular服務ApiClient進行API調用。我用browser.addMockModuleangular.module().factory()嘲笑那項服務。這讓我嘲笑我所有的後端API!這裏是我的代碼:如何使用量角器將消息從瀏覽器發送到WebDriver?

setup() { 
    // Out in WebDriver. 

    // Third argument 'apiRequestsMap' is made available as an argument 'map' 
    // to the anonymous function which constructs the module. 
    browser.addMockModule(
     'mockDataModule', 
     (map) => 
      angular.module('mockDataModule', []).value('apiRequestsMap', map), 
     this.apiRequestsMap_); 

    const apiModuleMaker =() => { 
    const mockModule = angular.module('mockapiModule', ['mockDataModule']); 
    mockModule.factory(
     'apiClient', 
     ($q, apiRequestsMap) => ({ 
      request: (req) => { 
      // In Browser. 
      // I can access 'apiRequestsMap'! 
      // And I use it to mock those API calls. 
      } 
     })); 
    }; 
    browser.addMockModule('mockapiModule', apiModuleMaker); 
    browser.get('www.mywebpage.com/example'); 
} 

這工作得很好,讓我建立了模擬的API在我的量角器測試。重要的是我可以將this.apiRequestsMap_變量從WebDriver傳遞到瀏覽器,作爲apiRequestsMap

現在我想知道 - 我可以做相反的事嗎? 如何將瀏覽器中的變量傳回WebDriver?

我的第一次嘗試只是編輯我通過的apiRequestsMap對象。但是這似乎是單向傳輸。即在In Browser中,設置apiRequestsMap.aVar = 5;不會更改this.apiRequestsMap_.aVar

看着量角器API,我也找到了browser.getRegisteredMockModules。不幸的是console.log(JSON.stringify(browser.getRegisteredMockModules()));打印出[null, null, null, null, null]

對不起,張貼這麼多的代碼和上下文!我在頭上,所以我不確定哪些部分可以刪除,同時允許我的代碼仍然運行。也許有更好的方法直接用WebDriver模擬API調用?這將是一個很好的解決方法。

另一個可能的外賣是我向量角器開發人員提交功能請求/錯誤。

+1

你想通過什麼對象?它只有價值嗎?它可以轉換爲JSON嗎?您是否能夠直接在瀏覽器控制檯中打印數據,而無需使用Selenium執行JS代碼? –

+0

理想情況下,我想傳遞的完整對象是一個對象數組(全部能夠使用JSON.stringify進行轉換)。我現在可以用console.log(JSON.stringify(req));''親自訪問它。不知道如何通過代碼訪問,但感謝這個想法! – hubatish

+0

因爲我只是在寫測試,所以我可能也只能通過'assert'或其他故障條件進行「溝通」。這可能是我接下來會嘗試的。 – hubatish

回答

2

您可以直接從Protractor在瀏覽器中執行Javascript代碼。

所以在JavaScript這樣做下面

window.__myvariable__ = {data:2, name: "abc"}; 

可以通過執行與硒一些JavaScript代碼來訪問。在量角器這是

browser.executeScript('return window.__myvariable__;'); 

它返回一個正常的期望量角器承諾。請注意0​​對象返回應該是json轉換。

這將得到您的測試代碼中的值,它將一直保留,直到頁面刷新。對於更詳細的回覆看看

Access window object/browser scope from protractor

+0

我應該把這個return語句放在哪裏?在瀏覽器上下文的某處;執行WebDriver代碼時窗口未定義。 – hubatish

+0

請參閱https://stackoverflow.com/questions/26102132/access-window-object-browser-scope-from-protractor以獲取更深入的解釋 – hubatish

+2

@hubatish,根據您的信息更新信息 –

相關問題