测试开发脚本化 - selenium的远程调用
脚本化的第二步是使用脚本做各种操作,那么我们就从最流行的selenium开始讲起。selenium是一个用来操作浏览器的工具库。
selenium的架构设计
selenium的具体架构并不重要,如果想对其进行了解,可以参考这篇文章:
http:// aosabook.org/en/seleniu m.html 不过这篇文章也比较老了。
为什么架构不重要呢?因为selenium采用这样的架构,一方面是由于它的一些历史原因,比如第一版由javascript实现,比如不同开源项目的合并等;另一方面是由于它为了使自己普及,而非常重视兼容性。这导致了很多多余的代码。因此,即使我们要开发类似的程序,也不会采用和selenium类似的架构。selenium里虽然有一些好设计,但也有很多差设计。
我们需要知道的是:
1.selenium需要驱动(driver)才能操作浏览器,而驱动是独立的用来驱动浏览器的程序。因此要单独下载,单独更新。
2.selenium的驱动和浏览器存在不同版本的兼容性问题,驱动要进行更新才能操作新版本的浏览器。而且新版驱动也未必能兼容所有老版浏览器。
3.selenium有headless模式(幽灵模式或称为无头模式),可以在不打开可视的浏览器的情况下仍然正常操作浏览器,甚至还能截图。这个模式可以提高脚本执行速度。
我这里采用的selenium运行模式是:
基于docker的远程headless模式
docker的安装
由于在不同设备与操作系统上安装docker的方式方法略有不同。请大家自行进行安装。
mac和linux上安装比较简单。
Win10上可以通过wsl安装docker,虽然复杂,但也能装好。
此处不再赘述其安装方法。
另外,最后顺便把docker-compose也安装了。docker-compose是一个python库,所以用 pip install docker-compose 即可进行安装。
附上我的环境的安装方法,我用的是aws的新加坡的ec2(就是亚马逊云提供的远程虚拟机):
例1.在aws ec2上安装docker
sudo yum install docker #安装docker
sudo service docker start #启动docker服务
python3 -m pip install docker-compose #安装docker-compose
在docker中安装selenium
在已经安装好docker的机器上,我们用docker命令来启动selenium以及浏览器。
先把镜像下载下来:
docker pull selenium/standalone-chrome
然后我们用 docker images命令可以看到这个镜像:
(此处$表示后面跟的是linux命令,实际输入时只要打后面的部分就可以了)
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
selenium/standalone-chrome latest efa240b85d81 5 days ago 1.02GB
接着我们写一个docker-compose.yml文件。
例2.把selenium启动在80端口的docker-compose.yml
version: '3'
services:
selenium-chrome:
image: "selenium/standalone-chrome"
volumes:
- /dev/shm:/dev/shm
environment:
- NODE_MAX_INSTANCES=45
- NODE_MAX_SESSION=45
- JAVA_OPTS=-Xmx512m
ports:
- "80:4444"
启动它:
$ docker-compose up -d
然后使用以下命令检查是否安装成功
$ curl localhost
如果返回一个html页面就成功了。
我们还可以这样来检查是否安装成功:用浏览器打开localhost页面,看是否能看到这个页面。
注意,因为我用的aws ec2,所以浏览器地址栏应该用真实公网ip。
而我们在docker-compose文件里对端口(ports)做了映射,所以才可以用80端口来访问4444端口。
如果你没做端口映射,那么这里应该用4444端口来访问这个页面。
点击这个页面上行的console链接可以进入sessions管理页面。如果你的docker和你跑测试的机器在同一个网段,那还可以用这个页面来截图。
编写第一个selenium脚本
例3.第一个selenium脚本
if __name__ == "__main__":
from selenium import webdriver
driver = webdriver.Remote(command_executor="http://localhost/wd/hub",
desired_capabilities=webdriver.DesiredCapabilities.CHROME)