selenium(chrome版的nodejs教程)
Selenium
一、介绍
- Selenium是一个Web自动化测试工具。可以模拟各种浏览器操作(如输入表单,点击按钮等操作),并且可以通过JS脚本获取页面各种元素的插件。
- 支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera,Edge等.
- 支持的开发语言包括C#,JavaScript,Java,Python,Ruby。
- github仓库 https://github.com/SeleniumHQ/selenium
二、主要用途
自动化测试
1.自动化测试是什么?
顾名思义,就是通过非人工的方式自动执行测试案例,按步骤自动输入指定数据,自动验证结果数据是否符合期望。
2.为什么需要自动化测试?
软件开发不是生产后就完全定型的产品。大部分都是需要修改迭代。每次迭代除了验证新功能是否正常,还需要测试旧功能是否也正常。如果我们每次都人工对旧功能再进行测试,投入大收益小。这个时候如果使用自动化测试,通过编写测试脚本,就可以达到一劳永逸的效果(当然,如果旧流程有变,也是需要对旧测试脚本进行修改的)。
三、需要掌握的技能
由于Selenium有各种主流语言的版本,所以基本上前后端都可以写自动化测试工具。但是也需要掌握基础的html和js,比如各种常见的dom选择器。
四、一个简单的Selenium程序(chrome版的nodejs实现)
选择chrome的理由。chrome更为主流,换成其他浏览器无非也是更换驱动,修改下代码浏览器类型。
选择nodejs的理由。由于js是解释型语言,不需要额外编译,对IDE依赖程序小,能快速看到效果。
nodejs版本和其他语言版本相比,所有的方法都是 Promise 异步的。所以为了顺序执行,最好使用await。
1.下载chromedriver
请根据你本机的chrome版本,下载对应的chromedriver。 下载地址:http://npm.taobao.org/mirrors/chromedriver 将下载下来的chromedriver.exe放到node.exe的同级目录,网上说可以配置环境变量PATH,不过我试了没效果。
2.安装依赖
新建一个文件夹,在命令行执行以下脚本
:: 初始化npm项目
npm init
:: 安装依赖,如果你有安装cnpm,使用cnpm安装更快
npm install selenium-webdriver --save
3.编写测试脚本
新建index.js
//引入包
var {Builder, By, Key, until} = require('selenium-webdriver');
//定义浏览器驱动
var driver = new Builder().forBrowser('chrome')
//远程脚本执行
//.usingServer('http://10.0.7.236:4444/wd/hub')
.build();
(async function example() {
//打开页面
await driver.get('https://www.baidu.com');
//输入文本
await driver.findElement(By.id('kw')).sendKeys('webdriver');
//点击按钮
await driver.findElement(By.id('su')).click();
//关闭窗口
//await driver.close();
//退出浏览器
//await driver.quit();
})();
4.运行脚本
在命令行执行以下指令,会自动启动一个浏览器,并且打开百度,输入文本进行搜索。
node index.js
五、主要API(chrome版的nodejs实现)
1.基本用法
//引入包
var {Builder, By, Key, until} = require('selenium-webdriver');
(async function example() {
//定义浏览器驱动
var driver = new Builder().forBrowser('chrome')
//远程脚本执行
//.usingServer('http://10.0.7.236:4444/wd/hub')
.build();
//打开页面
await driver.get('https://www.baidu.com');
//关闭窗口
//await driver.close();
//退出浏览器
//await driver.quit();
})();
2.选择器
//id选择器
var dom1 = await driver.findElement(By.id('kw'));
//name选择器
var dom2 = await driver.findElement(By.name('kw'));
//css选择器,推荐
var dom3 = await driver.findElement(By.css('#kw'));
//文本选择器
var dom4 = await driver.findElement(By.linkText("确认"));
3.执行js
await driver.executeScript("console.info('hello');")
//如果有执行等待操作的js,类似alert,请不要使用await
driver.executeScript("alert('hello');")
4.等待
//强制等待5秒
await driver.sleep(5000);
//10秒等待元素出现,10秒内出现则继续执行,否则报错。通常比强制等待耗时更短
await driver.wait(until.elementLocated(By.id('foo')), 10000);
//5秒内等待窗口标题变成xxx
await driver.wait(until.titleIs('xxx'),5000);
//5秒内等待窗口匹配正则表达式
await driver.wait(until.titleMatches('xxx'),5000);
//5秒内等待标题包含xxx
await driver.wait(unitl.titleContains('xxx'),5000);
//5秒内等待地址栏变成xxx
await driver.wait(unitl.urlIs('xxx'),5000);
//5秒内等待地址栏匹配正则表达式
await driver.wait(unitl.urlMatches('xxx'),5000);
//5秒内等待地址栏包含xxx
await driver.wait(unitl.urlContains('xxx'),5000);
//如需处理超时操作,请使用try-catch捕获异常
5.交互
// 输入框输入内容
await driver.find_element_by_id("kw").send_keys("seleniumm")
// 删除多输入的一个 m
await driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)
//输入空格
await driver.find_element_by_id("kw").send_keys(Keys.SPACE)
// ctrl+a 全选输入框内容
await driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'a')
// ctrl+x 剪切输入框内容
await driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'x')
// ctrl+v 粘贴内容到输入框
await driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'v')
// 回车
await driver.find_element_by_id("su").send_keys(Keys.ENTER)
6.iframe
当页面由多个框架构成,我们在进行页面交互的时候,必须先切换框架。
//切进iframe,xxx可以是id也可以是name。如果没有id和name,也可以使用序号0,1...
await driver.switchTo().frame('xxx');
//切回父框架
await driver.switchTo().parentFrame();
//切回主框架
await driver.switchTo().defaultContent();
7.其他
//获取当前url
var url = await driver.getCurrentUrl()
//获取当前标题
var title = await driver.getTitle()
//获取当前页面截图的base64
var imgbase64 = await driver.takeScreenshot()
更多帮助
https://www.selenium.dev/selenium/docs/api/javascript/
六、Selenium相关工具
Selenium Server
一个使用java开发的web服务,提供远程执行自动化的工具。也就是你本地写的每条指令都会发送到服务器上去运行然后返回处理结果给你。 具体没有用过,不知道是不是每个都起一个浏览器运行。
Selenium IDE
一个浏览器插件,可以录制操作脚本,并保存为对应语言的代码。对于前期学习写自动化脚本有一定帮助。