背景
前面的教程實現(xiàn)了在遠程服務(wù)器上部署selenium+chrome/firefox+vncserver實現(xiàn)了遠程服務(wù)器端腳本運行的GUI可視化赁炎。這樣不方便的地方是,腳本需要在服務(wù)器端編輯或者上傳腳本到服務(wù)器端调鬓,對于調(diào)試中的項目來說十分不方便房匆。
看了selenium remote server 的介紹卦尊,selenium可以實現(xiàn)不同機器之間的交互控制叛拷。在機器A上運行remote server控制機器B上的瀏覽器。 這樣配上VNC Viewer可以很方便的進行可視化操作了猫牡。
這方面的資料很少胡诗,因為上面提到的東西其實完全可以在本地機器上實現(xiàn),本地運行腳本淌友,本地瀏覽器可視化。但是筆主由于要使用國外代理PROXY骇陈,在國內(nèi)網(wǎng)絡(luò)環(huán)境下震庭,腳本十分緩慢。如果瀏覽器環(huán)境在境外服務(wù)器運行(網(wǎng)絡(luò)是國外的網(wǎng)絡(luò))你雌,然后實現(xiàn)本地腳本遠程控制器联,同時GUI進行可視化,就完美實現(xiàn)了自己的需求婿崭。廢話不多說進入正題拨拓,希望對有需要的朋友提供幫助,畢竟國內(nèi)資料太少氓栈,很多selenium教程還停留在selenium1 或者 selenium2渣磷,很多東西發(fā)生了變化。
思路
思路其實很簡單授瘦,根據(jù)官方網(wǎng)站介紹醋界,只需要在服務(wù)器端安裝selenium server就行了。
需要安裝JRE
(centos7 上有默認安裝的openjdk,最好卸載后安裝完整版提完,過程掠過)
下載地址:https://pypi.python.org/pypi/selenium
筆者當前版本為:Selenium Standalone Server 3.11.0
在服務(wù)器終端運行:java -jar selenium-server-standalone-3.11.0.jar
由于有VNC Server可以在GUI的瀏覽器“http://127.0.0.1:4444/wd/hub”上查看selenium server的控制面板:
根據(jù)教程介紹形纺,本地客戶端的代碼如下:
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.服務(wù)器端逐样,root用戶是不能直接運行chrome的。不然無法啟動chrome≈拢可行的方法是切換用戶秽澳,或者在啟動chrome時添加‘--no-sandbox'參數(shù)
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())
中間部分參數(shù)是可選的,‘--no-sandbox'不能去掉戏羽。
- 遇到無法連接遠程服務(wù)器的問題担神,連接無響應(yīng)。
在測試過程中遇到連接無響應(yīng)的情況始花,嘗試開放服務(wù)器端口妄讯,以及關(guān)閉防火墻都無法解決。目前還沒有找到正確的解決方案酷宵。猜想是因為selenium server 沒有綁定到外部IP上亥贸。
但是查看selenium的幫助文檔:
java -jar selenium-server-standalone-3.11.0.jar -h
沒有查看到有綁定IP的選項。
查詢了很多資料浇垦,發(fā)現(xiàn)有selenium2可以直接綁定外部IP的教程炕置,但是按照教程運行,提示無法找到執(zhí)行參數(shù)男韧。
最后經(jīng)過考慮朴摊,選用了使用selenium grid的替代方案。
1.首先啟動設(shè)置hub
java -Dwebdriver.chrome.whitelistedIps="" -jar selenium-server-standalone-3.11.0.jar -role hub -host <外部IP>
這里要用到-Dwebdriver.chrome.whitelistedIps這個參數(shù)此虑,不然會報錯only local connect allowed.
2.啟動設(shè)置一個node
java -Dwebdriver.chrome.whitelistedIps="" -jar selenium-server-standalone-3.11.0.jar -role node -port <端口號>
這里最好不要設(shè)置4444,第一次設(shè)置4444報錯甚纲,可能和hub的端口沖突了,但是我沒有第二次實驗朦前。
同時一定要設(shè)置開放防火墻的端口介杆。
完整代碼如下:
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://<服務(wù)器IP>:<設(shè)置的node端口>/wd/hub', desired_capabilities=chrome_options.to_capabilities())
driver.get('http://www.google.com')
print('ok it is done')
經(jīng)過測試,可以正常運行韭寸。
遺留的問題是:
不能直接使用selenium rc春哨,需要用selenium grid才能實現(xiàn)。
有知道的朋友恩伺,如能告知不勝感謝赴背。