2011-07-06 29 views
9

我使用RemoteWebDriver從我的筆記本電腦(java客戶端)在遠程PC上運行Selenium WebDriver測試。但是RemoteWebDriver並沒有提供截圖API來直接獲取遠程PC的截圖。谷歌搜索了很多,但發現似乎需要使用Json API直接從遠程WebDriver服務器獲取它。任何人都可以給我一些關於如何做到這一點的指導?謝謝。如何從RemoteWebDriver服務器獲取屏幕截圖而不是本地FirefoxDriver?

回答

12

必須先增加RemoteWebDriver,然後才能使用屏幕截圖功能。正如你毫無疑問已經發現的那樣,試圖在沒有增加效果的情況下施展例外。

WebDriver driver = new RemoteWebDriver(...); 
driver   = new Augmenter().augment(driver); 
((TakesScreenshot)driver).getScreenshotAs(...); 

+0

請您告訴我們爲什麼截圖功能沒有內置到RemoteWebDriver中?我想知道這個額外的步驟在後臺做了什麼。順便說一句,根據文檔,Augmenter是一個實驗性功能,必須謹慎使用。 – testerjoe2

3

我覺得這是最好的方法:

public<T> Object getScreenshotAs(OutputType<T> outputType) { 
    Augmenter augmenter = new Augmenter(); 
    TakesScreenshot ts = (TakesScreenshot) augmenter.augment(driver); 
    return ts.getScreenshotAs(outputType); 
} 
0

的RemoteWebDriver不實現TakesScreenShot這裏描述的施放方法RemoteWebDriver的TakesScreenShot實例將導致ClassCastException。我會看看我是否可以找到解決方案,因爲我有興趣做同樣的事情。

如果這個實例是一個RemoteWebDriver,Augmenter將「增強WebDriver實現的接口」。根據RemoteWebDriver的配置方式以及遠程主機上的Selenium服務器運行方式,可以使用org.openqa.selenium.remote.Augmenter獲取屏幕截圖。

我已經配置了RemoteWebDriver來使用DesiredCapabilities.htmlUnit()功能,這給了一個ClassCastError。如果RemoteWebDriver配置了實現TakesScreenshot接口的驅動程序的功能,則可能不會發生ClassCastException,儘管我尚未對此進行測試。

從TakesScreenshot接口,已知實現驅動程序是:AndroidDriver,AndroidWebDriver,ChromeDriver,EventFiringWebDriver,FirefoxDriver,InternetExplorerDriver,IPhoneDriver,IPhoneSimulatorDriver和SafariDriver

+0

我已經使用服務器上的Firefox驅動程序運行它,它確實有效! – gffny

5

我能得到這個工作...這裏是什麼你需要做的:

1)在一個實用程序目錄下創建一個新的類文件或地方

package com.util; 

import java.net.URL; 
import org.openqa.selenium.OutputType; 
import org.openqa.selenium.TakesScreenshot; 
import org.openqa.selenium.WebDriverException; 
import org.openqa.selenium.remote.CapabilityType; 
import org.openqa.selenium.remote.DesiredCapabilities; 
import org.openqa.selenium.remote.DriverCommand; 
import org.openqa.selenium.remote.RemoteWebDriver; 

public class ScreenShotRemoteWebDriver extends RemoteWebDriver implements TakesScreenshot { 

    public ScreenShotRemoteWebDriver(URL url, DesiredCapabilities dc) { 

     super(url, dc); 

    } 

    @Override 
    public <X> X getScreenshotAs(OutputType<X> target) throws WebDriverException { 

     if ((Boolean) getCapabilities().getCapability(CapabilityType.TAKES_SCREENSHOT)) { 
      return target.convertFromBase64Png(execute(DriverCommand.SCREENSHOT).getValue().toString()); 
     } 
     return null; 

    } 

} 

2)然後......你在哪裏都開始RemoteWeDriver,這種取代代碼:

driver = new ScreenShotRemoteWebDriver(new URL(-PUT YOUR HUB URL HERE-),cap); 

您的屏幕截圖將存儲在本地。

希望這會有所幫助。

+0

哇哇。我要試試這個! –

+0

真棒......讓我知道它是如何爲你工作的! – zerotres

相關問題