python+selenium Grid2 分布式自动化测试环境搭建

一、Selenium Server 环境配置

1、selenium grid的组成与作用:由一个集线器hub和多个客户机node组成,如果你的程序需要在不用的浏览器,不同的操作系统上测试,而且比较多的case需要多线程远程执行,那么一个比较好的测试方案就是使用 selenium grid,hub用来管理各个代理节点的注册和状态信息,并且接受远程客户端代码的请求调用,然后把请求的命令再转发给代理节点来执行。

    其结构组成:

           

 

2、下载 Selenium Server

  下载地址:http://www.seleniumhq.org/download/

  根据环境中selenium版本号,选择对应版本的selenium-server-standalone-xxx.jar。

  由于运行jar需要有对应的java环境,所以前提是要有java环境,在此略过java环境的大家。

3、运行selenium server

  通过命令行,切换到selenium server目录下,执行 java -jar selenium-server-standalone-xxx.jar。即可执行该jar包。

           

 

二、Selenium Grid 工作原理

       Grid 是用于设计帮助我们进行分布式测试的工具,其整个结构有一个hub主节点和若干个node代理节点组成。hub用来管理各个子节点的注册和状态信息,并接收远程客户端代码的请求调用,然后把请求的命令再转发给代理节点来执行。使用Grid远程执行测试的代码与直接调用Selenium Server是一样的,只是环境启动的方式不一样,需要同时启动一个hub和至少一个node。

     

#启动主节点
java -jar selenium-server-standalone-xxx.jar -role hub 

#启动代理节点 java -jar selenium-server-standalone-xxx.jar -role node

 

上面的代码分别启动了一个hub 和 一个node ,hub默认端口:4444,node默认端口为5555,若是同一台主机上启动多个node,则需要注意指定端口号,可以通过下面的方式来启动多个node节点。

        

#启动多个代理节点
java -jar selenium-server-standalone-xxx.jar -role node - port 5555

java -jar selenium-server-standalone-xxx.jar -role node - port 5556

java -jar selenium-server-standalone-xxx.jar -role node - port 5557

 

使用场景:当测试用例需要验证的环境比较多时,可以并行执行这些测试用例,从而缩短测试总耗时。并行的能力需要借助编程语言的多线程技术,后续会介绍Python的多线程技术,Grid 可以根据用例中指定的平台配置信息把用例转发给符合匹配要求的测试代理。

例如,用例中指定了要在Windows7上用firefox浏览器进行测试,那么Grid会自动匹配注册信息为Windows7且安装了firefox的代理节点,如果匹配成功,则转发测试请求,如果匹配失败则拒绝请求。调用基本结构图如下所示。

   

 

 

 一台计算机上可以启动一个hub或多个node节点。

如下图一个主机上启动了一个hub和两个node分支节点。

 

可以通过浏览器访问Grid的控制台:http://127.0.0.1:4444/grid/console 。

通过控制条查看启动的节点信息。

 

 

 三、Remote应用

1、Remote实例

1.1、首先启动 Selenium Server 

 java -jar selenium-server-standalone-2.48.2.jar 

1.2、编写自动化测试脚本。

         

复制代码
#-*-coding:utf-8-*-


from selenium import selenium
from selenium.webdriver import  Remote
import time

driver = Remote(command_executor='http://localhost:4444/wd/hub',
                desired_capabilities={'platform':'ANY',
                                      'browserName':'firefox',
                                      'version':'',
                                      'javascriptEnabled':True})

driver.get('http://www.baidu.com')
driver.find_element_by_id('kw').send_keys('remote')
driver.find_element_by_id('su').click()
time.sleep(5)
driver.quit()
复制代码

 

从上面的代码可以看出,Remote()方法配置来看,相当于直接使用了webdriver.Firefox(),但是Remote()却大大增加了配置的灵活性。

 

DesiredCapabilities 品台及浏览器的参数如下:

复制代码
FireFox = {'platform':'ANY', 'browserName':'firefox', 'version':'', 'javascriptEnabled':True, 'marionette':False }

Chrome = {'platform':'ANY', 'browserName':'chrome', 'version':'', 'javascriptEnabled':True }

Opera= {'platform':'ANY', 'browserName':'opera', 'version':'', 'javascriptEnabled':True }

Iphone= {'platform':'MAC', 'browserName':'iPhone', 'version':'', 'javascriptEnabled':True }

Android  = {'platform':'ANDROID', 'browserName':'android', 'version':'', 'javascriptEnabled':True }

.
.
.
.
.
复制代码

 

 四、参数化平台及浏览器

1、启动本地node

 实例如下:先创建list 字典,定义不同的主机ip,端口号及浏览器。然后,通过for循环读取lists字典中的数据作为Remote()的配置信息,从而使脚本在不同的节点及浏览器下执行。

复制代码
#-*-coding:utf-8-*-


from selenium import selenium
from selenium.webdriver import  Remote
import time

lists = {'http://localhost:4444/wd/hub':'chrome',
        'http://localhost:5555/wd/hub':'firefox'}


for host,browser in lists.items():
    print (host,browser)
    driver = Remote(command_executor=host,
                    desired_capabilities={'platform': 'ANY',
                                          'browserName': browser,
                                          'version': '',
                                          'javascriptEnabled': True})

    driver.get('http://www.baidu.com')
    driver.find_element_by_id('kw').send_keys('remote')
    driver.find_element_by_id('su').click()
    time.sleep(5)
    driver.quit()
复制代码

 

 2、启动远程node

2.1、前置条件:

2.1.1、本地hub主机与远程node主机之间可以用ping命令连通。

2.1.2、远程主机必须安装用例执行的浏览器驱动,并且驱动要放到环境变量path的目录下。

2.1.3、远程主机必须安装java环境,因为需要运行Selenium  Server。  

  

2.2、操作步骤:

 2.2.1、启动本地hub主机,查看主机ip

  java -jar selenium-server-standalone-2.48.2.jar -role hub

2.2.2、启动远程主机,查看ip

       java -jar selenium-server-standalone-2.48.2.jar -role node -port 5555 -hub http://hup主机ip:4444/grid/register

lists = {'http://localhost:4444/wd/hub':'chrome',
        'http://node主机ip:5555/wd/hub':'firefox'}

 

五、知识拓展

1、创建startup.bat文件

  在启动Selenium Server时,每次都要输入一长串命令,非常麻烦,可以启动命令生成批处理文件,方法很简单。首先创建一个startup.bat文件。

   如下图:

     

 

 2、另外我们还可以通过VisGrid工具来启动和管理节点,如下图:

 

 

 3、开机自启动startup.bat

对于分布式测试远程主机,如果每次测试前都要人为启动startup.bat,还是太复杂了。所以想到了开机自启动,首相想到的是做成service,结果没有实现成功。

后选择了开机自启动。

操作步骤如下。

 3.1、添加启动快捷方式,通过程序->启动,单击右键,打开所有用户

 

将快捷方式粘贴到该路径下。

 

 

3.2、通过运行执行msconfig,打开系统配置

 

 

然后勾选所要启动的程序,点击全部启动即可。至此,每次开机后,系统会自动执行startup.bat。缺点是每次都会弹出一个命令行窗口。

 

六、使用过程常遇到的问题

1、驱动没有添加到环境变量中。

2、配置了环境变量,但是仍然报错。如下图

产生原因:参照了网上 java -jar selenium.jar -role node -port 6666 -hub http://192.168.1.132:4444/grid/register -Dwebdriver.firefox.driver=firefox.exe  -browser browserName=firefox 这种写法。其实这种写法对于firefox有些多余。

直接这样写就行: java -jar selenium.jar -role node -port 6666 -hub http://192.168.1.132:4444/grid/register

 

 3、chrome 浏览器启动报错。

 

 

 同样是这种写法:java -jar selenium.jar -role node -port 6666 -hub http://192.168.1.132:4444/grid/register -Dwebdriver.chrome.driver=chromedriver.exe  -browser browserName=chrome

是因为没有在该路径下添加 chromedriver驱动。

 

 

解决办法

  (1)、在该路径下添加chromedriver即可。

  (2)、使用另一种写法:java -jar selenium.jar -role node -port 6666 -hub http://192.168.1.132:4444/grid/register

posted @ 2021-10-15 14:52  冬天里的狐狸  阅读(513)  评论(0编辑  收藏  举报