上一篇文章介绍了直接使用chrome headless模式进行测试的方法.这篇文章介绍一下使用selenium grid配合ssh port forward进行测试的方法.
在headless模式下,测试过程中看不到浏览器的UI页面,如果整个测试element定位没有问题,基本跑起来不会出错.但是如果有问题,那么因为看不到UI,会导致无法快速定位原因,此时有两个方法:
1.在启动headless模式的时候,将remote debug打开.在本地打开一个浏览器,连接到headless chrome的debug端口. 这个在后面的文章介绍.
2.通过selenium grid,让python代码跑在服务器上,chromedriver和chrome使用本地PC的,可以在本地的Chrome浏览器中看到整个测试过程.
使用ssh打通pc和remote的通道一般远程情况如下图. 我们的PC可以直接登录,或者透过跳板机登录到远程remote服务器上.要测试的UI界面在remote服务器上才可以访问.
先从openssh官网下载最新的window sssh包.到selenium官网下载最新的selenium-server jar包.本地PC和remote服务器上都安装好Java8.
然后编辑ssh配置文件ssh_config如下
# 本地的ssh需要的配置文件Host remote # 这部分不需要修改 StrictHostKeyChecking no UserKnownHostsFile myhost ServerAliveCountMax 4 ServerAliveInterval 10 TCPKeepAlive yes # 这部分需要修改,是从PC机器登陆到remote机器的方法 # remote机器的用户 User root # remote机器的IP Hostname 192.168.56.101 # remote机器的端口 Port 22 # 如果从PC机到remote需要经过跳板机,那么这儿把跳板机的信息填出来 # 否则直接注释了就可以了 #ProxyJump root@10.0.0.1:22 # 在remote机器上启动一个hub,使用的端口需要被确定出来,比如 # java -jar selenium-server-standalone-3.141.59.jar -role hub -port 54444 # 在PC上启动node的时候,连接自己的54444端口的时候,被forward到连接remote机器的54444端口 # 这个大部分情况不需要修改,如果要修改,两个端口保持一致,都是remote机器上启动hub使用的端口 LocalForward 54444 127.0.0.1:54444 # PC上启动一个node,需要在PC上开启127.0.0.1:54445. # 当hub需要一个webdriver来进行测试的时候,会连接127.0.0.1:54445 # 被转发到PC的54445端口 # java -jar selenium-server-standalone-3.141.59.jar -role node -host 127.0.0.1 -port 54445 -hub http://127.0.0.1:54444/grid/register # 这个大部分情况下不需要修改,如果要修改,两个端口保持一致,会在PC机上启动这个端口 RemoteForward 54445 127.0.0.1:54445 # PC上的chrome启动的时候,需要有一个socks5动态代理,这样才能正常登陆需要测试的UI # 如果网络不是直达的,需要给出来 DynamicForward 54448然后启动到remote的连接,连接好了之后保持这个窗口不关闭.
此时能看到本地的54444端口开启了,当在PC机上连接54444端口的时候,相当于连接remote的54444端口.同时remote的54445端口开启了,当在remote上连接54445端口是,相当于连接pc机的54445端口.
在remote上启动hub
java -jar selenium-server-standalone-3.141.59.jar -role hub -port 54444在pc上启动node
java -jar selenium-server-standalone-3.141.59.jar -role node -host 127.0.0.1 -port 54445 -hub http://127.0.0.1:54444/grid/register能从hub和node的日志看到两者连接好了.
使用Remote进行测试在remote中使用如下代码进行测试.注意driver是Remote类型的,chromeOptions是本地PC打开浏览器使用的选项,这儿只是给了一个Proxy选项,不会给headless之类的了.
import loggingfrom datetime import datetimefrom selenium import webdriverlogging.basicConfig()logging.getLogger().setLevel(logging.DEBUG)chromeOptions = webdriver.ChromeOptions()chromeOptions.add_argument(f"--proxy-server=socks5://127.0.0.1:54448")driver = webdriver.Remote(command_executor=f"http://127.0.0.1:54444/wd/hub", desired_capabilities=chromeOptions.to_capabilities())driver.maximize_window()driver.get("http://www.baidu.com")_now = datetime.now().strftime('%Y%m%d-%H%M%S')driver.save_screenshot(f'baidu-{_now}.png')driver.quit()测试过程中可以看到PC上打开了一个受控制的chrome浏览器,然后先被最大化,然后访问了baidu,然后被截图,最后浏览器被关闭.
在remote上可以看到截图的Png文件
截图如下.