2017-10-18 89 views
0

Spectron是一個node.js框架,用於自動化應用程序Electron。我使用Spectron以及AVATypescript來執行自動化集成測試。我使用AVA's suggest method來製作測試的上下文類型安全,但我無法弄清如何在Spectron的客戶端屬性(這是webdriverio客戶端)上獲得類型安全。我只能看到Spectron打字稿定義文件提供的一些屬性,這導致了打字稿傳輸錯誤。如何爲SpectronClient實現Typescript webdriverio?

這是我得到的錯誤:

src/pages/drive-shell.ts(7,34): error TS2339: Property 'waitForVisible' does not exist on type 'SpectronClient'. 
src/pages/login.ts(7,34): error TS2339: Property 'waitForVisible' does not exist on type 'SpectronClient'. 
src/pages/login.ts(11,21): error TS2339: Property 'setValue' does not exist on type 'SpectronClient'. 
src/pages/login.ts(12,21): error TS2339: Property 'setValue' does not exist on type 'SpectronClient'. 
src/pages/login.ts(13,21): error TS2339: Property 'click' does not exist on type 'SpectronClient'. 

回答

0

我其實解決了這個,因爲我是打字的問題,但因爲我做了一些搜索想通,但沒有找到,我想我可能會回答任何解決方案我自己的問題,以幫助他人。

我需要得到的webdriver的分型IO

npm i -S @types/webdriverio 

,然後我進口的那種類型到我login.ts腳本,並用其作爲SpectronClient

import * as WebdriverIO from 'webdriverio'; 
export class Login { 
    constructor(private client: WebdriverIO.Client<void>) { } 

    public async waitForPageToLoad() { 
     return await this.client.waitForVisible('#username'); 
    } 

    public login(username: string, password: string) { 
     this.client.setValue('#username', username); 
     this.client.setValue('#Password', password); 
     this.client.click('#login'); 
    } 
} 

,這裏是我的全test.ts測試腳本

import * as ava from 'ava'; 
import { Application } from 'spectron'; 
import { Login } from './pages/login'; 
import { Settings } from './settings'; 

function contextualize<T>(getContext:() => Promise<T>): ava.RegisterContextual<T> { 
    ava.test.beforeEach(async (t) => { 
     Object.assign(t.context, await getContext()); 
    }); 
    return ava.test; 
} 
const test = contextualize(async() => { 
    const app = new Application({ 
     path: '../electron.exe', 
     args: ['../app/index.html'], 
    }); 
    await app.start(); 
    return { app }; 
}); 

test.afterEach.always(async (t) => await t.context.app.stop()); 

test('can login', async (t) => { 
    const login = new Login(t.context.app.client); 
    await login.waitForPageToLoad(); 
    login.login(Settings.username, Settings.password); 
});