Selenium-Python 如何客户端远程控制服务器端selenium server,实现脚本远程控制浏览器

背景

前面的教程实现了在远程服务器上部署selenium+chrome/firefox+vncserver实现了远程服务器端脚本运行的GUI可视化。这样不方便的地方是,脚本需要在服务器端编辑或者上传脚本到服务器端,对于调试中的项目来说十分不方便。
看了selenium remote server 的介绍,selenium可以实现不同机器之间的交互控制。在机器A上运行remote server控制机器B上的浏览器。 这样配上VNC Viewer可以很方便的进行可视化操作了。
这方面的资料很少,因为上面提到的东西其实完全可以在本地机器上实现,本地运行脚本,本地浏览器可视化。但是笔主由于要使用国外代理PROXY,在国内网络环境下,脚本十分缓慢。如果浏览器环境在境外服务器运行(网络是国外的网络),然后实现本地脚本远程控制,同时GUI进行可视化,就完美实现了自己的需求。废话不多说进入正题,希望对有需要的朋友提供帮助,毕竟国内资料太少,很多selenium教程还停留在selenium1 或者 selenium2,很多东西发生了变化。

思路

思路其实很简单,根据官方网站介绍,只需要在服务器端安装selenium server就行了。
需要安装JRE
(centos7 上有默认安装的openjdk,最好卸载后安装完整版,过程掠过)
下载地址:https://pypi.python.org/pypi/selenium
笔者当前版本为:Selenium Standalone Server 3.11.0
在服务器终端运行:java -jar selenium-server-standalone-3.11.0.jar

由于有VNC Server可以在GUI的浏览器“http://127.0.0.1:4444/wd/hub”上查看selenium server的控制面板:
在这里插入图片描述

根据教程介绍,本地客户端的代码如下:

driver = RemoteWebDriver(command_executor='http://<remoteserver external IP>:4444/wd/hub', desired_capabilities=desired_capabilities)
driver.get('http://www.google.com')
print('ok, it is done')

按照教程就可以正常运行了,但是遇到的问题很多。

遇到的问题以及解决方法

1.服务器端,root用户是不能直接运行chrome的。不然无法启动chrome。可行的方法是切换用户,或者在启动chrome时添加‘–no-sandbox’参数

from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--user-data-dir')
chrome_options.add_argument('--dns-prefetch-disable')
chrome_options.add_argument('--lang=en-US')
chrome_options.add_argument('--disable-setuid-sandbox')
chrome_options.add_argument('--disable-gpu')
driver = RemoteWebDriver(command_executor='http://<remoteserver external IP>:4444/wd/hub'', desired_capabilities=chrome_options.to_capabilities())

中间部分参数是可选的,‘–no-sandbox’不能去掉。

2.遇到无法连接远程服务器的问题,连接无响应。
在测试过程中遇到连接无响应的情况,尝试开放服务器端口,以及关闭防火墙都无法解决。目前还没有找到正确的解决方案。猜想是因为selenium server 没有绑定到外部IP上。
但是查看selenium的帮助文档:
java -jar selenium-server-standalone-3.11.0.jar -h
没有查看到有绑定IP的选项。
查询了很多资料,发现有selenium2可以直接绑定外部IP的教程,但是按照教程运行,提示无法找到执行参数。
最后经过考虑,选用了使用selenium grid的替代方案。

1.首先启动设置hub

java -Dwebdriver.chrome.whitelistedIps=“” -jar selenium-server-standalone-3.11.0.jar -role hub -host <外部IP>

这里要用到-Dwebdriver.chrome.whitelistedIps这个参数,不然会报错only local connect allowed.

2.启动设置一个node

java -Dwebdriver.chrome.whitelistedIps=“” -jar selenium-server-standalone-3.11.0.jar -role node -port <端口号>

这里最好不要设置4444,第一次设置4444报错,可能和hub的端口冲突了,但是我没有第二次实验。

同时一定要设置开放防火墙的端口。

完整代码如下:

from selenium.webdriver.chrome.webdriver import RemoteWebDriver
from selenium.webdriver.chrome.options import Options


chrome_options = Options()
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--user-data-dir')
chrome_options.add_argument('--dns-prefetch-disable')
chrome_options.add_argument('--lang=en-US')
chrome_options.add_argument('--disable-setuid-sandbox')
chrome_options.add_argument('--disable-gpu')
driver = RemoteWebDriver(command_executor='http://<服务器IP>:<设置的node端口>/wd/hub', desired_capabilities=chrome_options.to_capabilities())
driver.get('http://www.google.com')
print('ok it is done')

经过测试,可以正常运行。

遗留的问题是:
不能直接使用selenium rc,需要用selenium grid才能实现。

有知道的朋友,如能告知不胜感谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值