首发于 测试进阶
测试开发脚本化 - selenium的远程调用

测试开发脚本化 - selenium的远程调用

脚本化的第二步是使用脚本做各种操作,那么我们就从最流行的selenium开始讲起。selenium是一个用来操作浏览器的工具库。

selenium的架构设计

selenium的具体架构并不重要,如果想对其进行了解,可以参考这篇文章:

aosabook.org/en/seleniu 不过这篇文章也比较老了。

为什么架构不重要呢?因为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)