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

Java 如何从RemoteWebDriver服务器而不是本地FirefoxDriver获取屏幕截图?,java,selenium,webdriver,Java,Selenium,Webdriver,我使用RemoteWebDriver在笔记本电脑(java客户端)的远程PC上运行SeleniumWebDriver测试。但是RemoteWebDriver并没有提供截图API来直接获取远程PC的截图。谷歌搜索了很多,但发现似乎需要使用Json API来直接从RemoteWebDriver服务器获取截图。谁能给我一些关于如何做的指导?谢谢。必须先增强RemoteWebDriver,然后才能使用屏幕截图功能。毫无疑问,您已经发现,尝试强制转换而不增加会导致异常 WebDriver driver =

我使用RemoteWebDriver在笔记本电脑(java客户端)的远程PC上运行SeleniumWebDriver测试。但是RemoteWebDriver并没有提供截图API来直接获取远程PC的截图。谷歌搜索了很多,但发现似乎需要使用Json API来直接从RemoteWebDriver服务器获取截图。谁能给我一些关于如何做的指导?谢谢。

必须先增强
RemoteWebDriver
,然后才能使用屏幕截图功能。毫无疑问,您已经发现,尝试强制转换而不增加会导致异常

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

这里是另一个解决方案:
我认为这是最好的方法:

public<T> Object getScreenshotAs(OutputType<T> outputType) {
    Augmenter augmenter = new Augmenter(); 
    TakesScreenshot ts = (TakesScreenshot) augmenter.augment(driver);
    return ts.getScreenshotAs(outputType);
}
公共对象getScreenshotAs(输出类型输出类型){
Augmenter Augmenter=新的Augmenter();
TakesScreenshot ts=(TakesScreenshot)augmenter.augment(driver);
返回ts.getScreenshotAs(outputType);
}

RemoteWebDriver未实现TakesScreenShot,此处描述的将RemoteWebDriver实例强制转换为TakesScreenShot的方法将导致ClassCastException。我会看看是否能找到解决办法,因为我也有兴趣这样做

当WebDriver实例是RemoteWebDriver时,增强器将“增强此WebDriver实例实现的接口”。根据RemoteWebDriver的配置方式以及selenium服务器在远程主机上的运行方式,可以使用org.openqa.selenium.remote.Augmenter获得屏幕截图

我已将RemoteWebDriver配置为使用DesiredCapabilities.htmlUnit()功能,这将提供一个ClassCastError。如果RemoteWebDriver配置了实现TakesScreenshot接口的驱动程序的功能,则可能不会发生ClassCastException,尽管我尚未对此进行测试


在TakesScreenshot界面中,已知的实现驱动程序有:AndroidDriver、AndroidWebDriver、ChromeDriver、EventFiringWebDriver、FirefoxDriver、InternetExplorerDriver、iPhone驱动程序、iPhone模拟器驱动程序和SafariDriver

我能够实现这一功能……以下是您需要做的:

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;

    }

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


希望这能有所帮助。

我已经在服务器上使用Firefox驱动程序运行了这个程序,它确实可以工作!你能告诉我们为什么RemoteWebDriver没有内置屏幕截图功能吗?我想知道这个额外的步骤在后台做什么。顺便说一句,根据文档,增强功能是一个实验性功能,必须谨慎使用。
driver = new ScreenShotRemoteWebDriver(new URL(-PUT YOUR HUB URL HERE-),cap);