如何从RemoteWebDriver服务器而不是本地FirefoxDriver获取屏幕截图?

时间:2011-07-06 03:04:52

标签: java selenium webdriver

我正在使用RemoteWebDriver从我的笔记本电脑(Java客户端)在远程PC上运行Selenium WebDriver测试。但是RemoteWebDriver还没有提供截屏API来直接获取远程PC的截图。谷歌搜索了很多,但发现似乎需要使用Json API直接从remoteWebDriver服务器获取它。任何人都可以给我一些关于如何做的指示?感谢。

5 个答案:

答案 0 :(得分:12)

必须先扩充RemoteWebDriver,然后才能使用屏幕截图功能。毫无疑问,你已经发现,试图在没有增加的情况下进行投射会导致异常。

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

答案 1 :(得分:5)

我能够让这个工作......这就是你需要做的事情:

1)在Util目录或某处

创建一个新的类文件
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);

您的屏幕截图将存储在本地。

希望这有帮助。

答案 2 :(得分:3)

我认为这是最好的方法:

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

答案 3 :(得分:0)

答案 4 :(得分: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