如果我們UI自動化指令碼跑在 Linux 伺服器環境上,這個時候我們是看不到介面的,如果不使用瀏覽器的無頭模式,這個時候我們的程式就跑不起來了,如何在伺服器環境不使用瀏覽器的無頭模式下進行UI測試呢,我們可以通過 MobaXterm 和 X11 Forwarding 遠端顯示伺服器上的圖形化介面(GUI 程式)來實現。
首先我們來認識下什麼是 X11 Forwarding ?它是用來幹嘛的?
以下介紹引用文章:
X11 Forwarding 介紹
X 協議
Linux 本身是沒有圖形化介面的,所謂的圖形化介面系統只不過中 Linux 下的應用程式。這一點和 Windows 不一樣。Windows 從 Windows 95 開始,圖形介面就直接在系統核心中實現了,是作業系統不可或缺的一部分。Linux 的圖形化介面,底層都是基於 X 協議。
X 協議由 X server 和 X client 組成:
- X server 管理主機上與顯示相關的硬體設定(如顯示卡、硬碟、滑鼠等),它負責螢幕畫面的繪製與顯示,以及將輸入設定(如鍵盤、滑鼠)的動作告知 X client。
- X client (即 X 應用程式) 則主要負責事件的處理(即程式的邏輯)。
舉個例子,如果使用者點選了滑鼠左鍵,因為滑鼠歸 X server 管理,於是 X server 就捕捉到了滑鼠點選這個動作,然後它將這個動作告訴 X client,因為 X client 負責程式邏輯,於是 X client 就根據程式預先設定的邏輯(例如畫一個圓),告訴 X server 說:“請在滑鼠點選的位置,畫一個圓”。最後,X server 就響應 X client 的請求,在滑鼠點選的位置,繪製並顯示出一個圓。
X11 Forwarding
這麼繞,有啥意義呢?當然有!
許多時候 X server 和 X client 在同一臺主機上,這看起來沒什麼。但是, X server 和 X client 完全可以執行在不同的機器上,只要彼此通過 X 協議通訊即可。於是,我們就可以做一些“神奇”的事情,比如像本文開頭談到的,在本地顯示 (X server),執行在伺服器上的 GUI 程式 (X client)。這樣的操作可以通過 SSH X11 Forwarding (轉發) 來實現。
X11 中的 X 指的就是 X 協議,11 指的是採用 X 協議的第 11 個版本。
MobaXterm 工具
那 MobaXterm 又是什麼鬼?MobaXterm 是一款開源、免費的、全功能終端軟體。它與 PuTTY 類似,但卻比 PuTTY 要強大得多,其中一個很實用的功能就是 MobaXterm 自帶 X Server。這樣我們就不用勞神地去想怎麼在 Windows 上啟動 X server 了。
MobaXterm官網:https://mobaxterm.mobatek.net/
MobaXterm 下載:https://fenxiangdayuan.lanzous.com/ijMPOjxb43a
小結一下,整個實現邏輯就是:
本地機器採用 MobaXterm (自帶 X server) 連線遠端伺服器。然後,在伺服器上執行 GUI 程式 (即 X client),通過 SSH X11 Forwarding,轉發到本地 (Windows 機器上)。
Centos7 + X11 Forwarding + MobaXterm 環境搭建
伺服器端
安裝 X11 Forwarding 相關軟體,執行命令:
yum install xorg-x11-xauth xorg-x11-fonts-* xorg-x11-font-utils xorg-x11-fonts-Type1 xclock
啟用 X11 Forwarding, 需要修改 ssh 的配置資訊,如下
vi /etc/ssh/sshd_config
將 X11Forwarding 和 X11UseLocalhost 前面的 # 去掉,並將 X11Forwarding 設定為 yes,X11UseLocalhost 設定為 no :
#AllowAgentForwarding yes
#AllowTcpForwarding yes
#GatewayPorts no
X11Forwarding yes
#X11DisplayOffset 10
X11UseLocalhost no
重啟 sshd 服務:
systemctl restart sshd.service
本地 (Windows 端)
下載並安裝好 MobaXterm ,建立一個session,填寫對應的配置資訊遠端連線到伺服器
注意到 X11-forwarding 和 DISPLAY 這兩項都打上了綠色的勾,代表設定成功了。
驗證
在伺服器端執行一個 GUI 程式,例如輸入命令:
xclock
這時候,你在本地 (Windows 端),就可以看到相應的圖形化介面(視窗)
那麼在我們執行 UI自動化指令碼的時候,就可以在本地(Windows 端)看到瀏覽器的執行過程了,例如在 Linux 系統啟動 chrome 瀏覽器訪問百度地址,輸入命令:
chrome --no-sandbox https://www.baidu.com
我們就能看到開啟如下介面了:
中文顯示問題
如果開啟的瀏覽器中文顯示不出來(顯示的都是小方塊),這是因為伺服器字型庫沒有對應字型的問題,參考下面的文章解決:
X11 Forwarding顯示中文: