1.簡介
當本機上沒有瀏覽器,需要遠程調用瀏覽器進行自動化測試時,需要用到RemoteWebDirver。宏哥申請服務器還沒有下來,也懶得自己在本地安裝虛擬機,等的時間太長了於是就網上找了一個可以免費試用2天的服務器(網址:https://www.varidata.com/),注冊一下基本上幾個小時后,就可以用了有興趣的你也可以自己申請一個。文章中可能前后的服務器不一樣,所以截圖有點瑕疵,抱歉啊。
2.RemoteWebDriver簡介
RemoteWebDriver包括兩部分:客戶端和服務端
1)客戶端就是我們要運行測試用例(腳本)
2)服務端就是我們啟動的服務
3.應用場景
想像一下最簡單的一個應用場景:你和你的同事兩人一起開發一段webdriver腳本,然后你們需要在一個公共的環境去運行這段腳本。為什么要在公共的環境運行?那是因為每個人的開發機器是有差異的,但是如果用同一台測試機的話,那么環境差異的因素就可以基本排除。我們應該經常聽到開發說這樣的話:"這個bug在我的環境上是好的啊!"。因為運行環境不同而造成的bug比比皆是,因此我們需要一個統一的運行環境來消除差異。這樣就不會出現"這個bug在我的環境上是好的啊!"類似的問題了。
在這樣的應用場景下,我們就需要使用remote webdriver,我們在本地開發腳本,然后調用remote webdriver,在測試機器上執行我們的測試。
4.RemoteWebDriver優缺點
(1)更方便跨平台、瀏覽器的測試;
(2)測試更加穩定;(在本地啟動瀏覽器測試時,可能會由於相關操作導致測試不穩定);
(3)RemoteWebDriver使測試用例和被測的瀏覽器可以不用部署在同一台機子上,比如當前運行測試用例的本地沒有瀏覽器a,你又想用a去跑,可以通過發送遠程命令到遠程有 a瀏覽器的測試機去跑,省在搭環境,但缺點是從遠端服務端發送來的字符串可能存在結尾符號不兼容問題,還有就是會增加網絡延時。
(4)可以使執行測試的機器和發送測試命令的機器獨立開來,比如A機器,是寫測試代碼的機器,可以發送測試命令給服務器,可以理解為客戶端;B機器是執行測試代碼的機器,可以理解為服務器端,A發送命令給B,然后再B上面執行測試,並返回結果給A。
5.環境准備
1. 安裝JDK(jdk1.8.0_101),這個需要在客戶端和服務端都需要安裝,客戶端需要運行java代碼,而服務端需要啟動一個java的jar包服務,所以都需要安裝JDK並配置環境變量;
2. 下載安裝firefox,chrome瀏覽器 ;
3. 下載selenium-server-standalone.jar (官方下載地址);
4. 下載InternetExplorerDriver,ChromeDriver,geckodriver(selenium3.0以及之后的版本支持的firefox driver);
5. 兩台機器,一台作為客戶端,一台作為服務器端。
6.服務端配置
6.1安裝JDK
安裝jdk,宏哥這里在服務器安裝的是1.8,將環境變量配置好(可以參考宏哥這篇文章:https://www.cnblogs.com/du-hong/p/11670441.html其中有如何配置JDK的環境變量方法)。好像selenium-server3.0.0以上版本需要依賴java8(這個沒有驗證過),如果大家在啟動server的過程中報錯,可以嘗試將jdk修改為1.8或者更高版本試一下。如下圖所示:

6.2安裝firefox,chrome瀏覽器
這個宏哥在這里就不贅述了,直接下載安裝包,傻瓜式安裝即可。
6.3下載selenium-server-standalone.jar
官方下載地址:https://www.selenium.dev/downloads/
6.4下載瀏覽器驅動
下載chromedriver,geckodriver(selenium3.0以及之后的版本支持的firefox driver)
(1)chromedriver官方下載地址:
【國外】chromedriver所有版本下載地址:http://chromedriver.storage.googleapis.com/index.html
【國內】chromedriver所有版本下載地址:https://npm.taobao.org/mirrors/chromedriver
【國內】chrome所有版本下載地址:https://www.chromedownloads.net/chrome64win/
【國外】瀏覽器版本和驅動版本對應關系查看網址:http://chromedriver.chromium.org/downloads
(2)geckodriver官方下載地址:https://github.com/mozilla/geckodriver/releases
說明:由於我下載的serverselenium-server-standalone.jar是3.141.59版本的,所以這里需要下載geckodriver,如果你本機的server不是3.0.0以及之后的版本,則不用單獨下載firefox driver(geckodriver),可以直接使用selenium客戶端的老版本的firefoxdriver。
如果是跟隨宏哥的教程學習的小伙伴或者童鞋們,其中第一步、第二步、第三步和第四步你可以直接將你本機中的JDK安裝目錄文件、Chrome安裝目錄文件、Eclipse中的selenium-server-standalone-3.141.59.jar和瀏覽器驅動直接拷貝到服務端即可!宏哥為了省事就直接拷貝到服務器上,這樣就不用擔心版本匹配的問題了,因為你已經在你本地驗證過了如下圖所示:
(1)本機(客戶端)的JDK:

(2)本機(客戶端)的Chrome:

(3)本機(客戶端)的jar和瀏覽器驅動:
(1)服務器的Chrome:

(2)服務器的JDK、jar和瀏覽器驅動:

7.客戶端和服務器的操作
Selenium框架的遠程控制主要是通過RemoteWebDriver這個類來實現的。
7.1服務器端
為了保持測試環境一致,所以我們將測試環境部署在服務器上,代碼在本地也就是客戶端【測試環境放在服務器上,執行代碼的機器為客戶機】

7.2服務器操作
1. 首先配置JDK,並配置環境變量,增加放WebDriver文件的地址(即將相應的WebDriver文件夾配置到環境變量的path中)
2. 啟動獨立測試jar包(注意JAR包的版本號),如果是配置了JDK的環境變量直接使用下邊的命令就可以
java -jar C:\Java\selenium-server-standalone-2.46.0.jar
3.如果沒有配置,則需要進入JDK安裝目錄下的bin文件夾中,然后在路徑輸入框,輸入cmd回車,或者直接使用命令進入bin文件夾目錄,然后再使用上邊的命令。宏哥這里在服務器就沒有配置(因為臨時演示就懶得配置)。

4. 命令啟動的端口默認是4444,如果被占用了,你可以指定端口啟動,命令如下:
java -jar C:\Java\selenium-server-standalone-2.46.0.jar -port 5566

7.3客戶端
客戶端操作
1. 驗證服務端響應是否正常。在瀏覽器中輸入地址:http://服務器IP地址:端口/wd/hub/ ,顯示如下頁面。

8.遠程測試
8.1代碼設計
測試代碼,通過RemoteWebDriver調用服務器

8.2參考代碼
package lessons; import java.io.File; import java.net.URL; import java.text.SimpleDateFormat; import java.util.Calendar; import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.OutputType; import org.openqa.selenium.TakesScreenshot; import org.openqa.selenium.WebDriver; import org.openqa.selenium.remote.DesiredCapabilities; import org.openqa.selenium.remote.RemoteWebDriver; import org.apache.commons.io.FileUtils; /** * @author 北京-宏哥 * * @公眾號:北京宏哥 * * @《手把手教你》系列技巧篇(六十二)-java+ selenium自動化測試-RemoteWebDriver讓你的代碼與測試分離(遠程測試)(詳細教程) * * @2022年1月21日 */ public class Remote { public static void main(String[] args) throws Exception { // RemoteWebDriver的基本使用 //第一個參數:表示服務器的地址。第二個參數:表示預期的執行對象,其他的瀏覽器都可以以此類推 WebDriver driver = new RemoteWebDriver(new URL("http://103.194.186.114:5566/wd/hub/"), DesiredCapabilities.chrome()); driver.manage().window().maximize(); driver.get("http://www.baidu.com"); Thread.sleep(2000); System.out.println("開始"); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss"); //轉換時間格式 String time = dateFormat.format(Calendar.getInstance().getTime()); //獲取當前時間 File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE); //執行屏幕截取 FileUtils.copyFile(srcFile, new File("屏幕截圖", time + ".png")); //利用FileUtils工具類的copyFile()方法保存getScreenshotAs()返回的文件;"屏幕截圖"即時保存截圖的文件夾 Thread.sleep(2000); JavascriptExecutor js = (JavascriptExecutor)driver; js.executeScript("alert('我現在在服務器')"); Thread.sleep(5000); System.out.println("browser will be close"); driver.quit(); } }
8.3運行代碼
1.運行代碼,右鍵Run AS->Java Appliance,控制台輸出,如下圖所示:

2.運行代碼后服務端的瀏覽器的動作,如下小視頻所示:
3. 執行腳本。執行過程中可以看到服務器的瀏覽器被調用,同時cmd窗口中打印出相關的運行信息,如下
9.小結
1.今天講解的其實也很簡單,說白了就是將你本地的測試環境在服務器上部署一套,然后通過服務器的IP,本地通過RemoteWebDriver類來遠程控制服務器。注意瀏覽器驅動的環境變量的配置,否則就會找不到驅動.如果為了省事可以直接將驅動復制到system32的文件夾下就可以。如下圖所示:

2.端口被占用,啟動服務報錯,如下圖所示:

3.宏哥復制Chrome瀏覽器時,直接復制到服務器的C盤的根目錄,結果報如下圖錯誤:

解決辦法:,宏哥將其復制到服務器的:C:\Program Files (x86)目錄下,成功運行。

最后一個的報錯,網上有的說是服務器端的瀏覽器沒有關閉,關閉就可以了,宏哥專門打開瀏覽器,運行了一下代碼,正常運行,感覺和這個瀏覽器是否關閉沒有關系。

