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'不能去掉。
- 遇到无法连接远程服务器的问题,连接无响应。
在测试过程中遇到连接无响应的情况,尝试开放服务器端口,以及关闭防火墙都无法解决。目前还没有找到正确的解决方案。猜想是因为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才能实现。
作者:StillWater_7e10
链接:https://www.jianshu.com/p/5e8f44e6a1fd
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。