目前计划使用脚本进行一部分浏览器内交互的自动化测试,选用了selenium-webdriver框架来具体实现,中间遇到了一些问题和实现,记录在此。
1 安装
安装核心基础类库。 代码均使用Typescript编写,所以此项目安装了Typescript和ts-node-dev本地服务。
2 启动(以chrome为例)
import { Builder } from "selenium-webdriver"
import { Options } from "selenium-webdriver/chrome"
import { logger } from "./logger/logger"
import { run } from "./tests"
import { defaultChromePath, defaultChromeUserDataPath, startupUrl } from "./model/option"
try {
;(async () => {
const options = new Options()
options
.setChromeBinaryPath(defaultChromePath)
.addArguments(`--user-data-dir=${defaultChromeUserDataPath}`)
.addArguments("--ignore-certificate-errors")
.addArguments("--ignore-ssl-errors")
const driver = await new Builder().forBrowser("chrome").setChromeOptions(options).build()
await driver.get(startupUrl)
await run(driver)
})()
} catch (e) {
logger.error(e)
}
3说明
以下是启动配置文件,里面是本机chrome安装位置,以及使用的用户数据。当然你可以不指定,但是这样的话,浏览器将会使用一个空白的用户来启动,里面不会包含任何历史数据,保存的用户名密码,缓存等。
// ./mode/option.ts 文件
export const defaultChromePath = `C:\\chrome-install-path\\chrome.exe`
export const defaultChromeUserDataPath = "C:\\Users\\Username\\AppData\\Local\\Google\\Chrome\\User Data"
export const startupUrl = "http://localhost:8080"
4 用例
// ./tests 默认用例示意
import { WebDriver } from "selenium-webdriver"
import dayjs from "dayjs"
import { logger } from "../logger/logger"
import { login } from "./login"
async function showTimeCost(desc: string, action: () => Promise<void>) {
const start = new Date()
await action()
const now = new Date()
const costM = dayjs(now).diff(start, "minute")
const costS = dayjs(now).diff(start, "second")
const cost = costM ? `${costM}分钟` : `${costS}秒`
logger.log(`运行任务[${desc}]时间花费:${cost}`)
}
export async function run(driver: WebDriver) {
showTimeCost("全项目", async () => {
await login(driver)
...其他用例
logger.log(`所有测试任务都已完成`)
})
}