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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/6591125/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-30 16:30:47  来源:igfitidea点击:

How to get screenshot from RemoteWebDriver server instead of local FirefoxDriver?

javaseleniumwebdriver

提问by Wahaha2001

I am running Selenium WebDriver test on a remote PC from my laptop(java client), by using RemoteWebDriver. But RemoteWebDriver haven't provided screenshot API to directly get a screenshot of remote PC. Googled a lot but found seems need use to Json API to get it from remoteWebDriver server directly. Anyone can give me some instruction about how to do that? Thanks.

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

回答by Mike Kwan

The RemoteWebDrivermust be augmented before you can use the screenshot capability. As you have no doubt already found, attempting to cast without augmenting results in an exception.

RemoteWebDriver在您可以使用屏幕截图功能之前,必须对其进行扩充。毫无疑问,您已经发现,尝试在不增强的情况下进行转换会导致异常。

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


回答by zerotres

I was able to get this working...here is what you need to do:

我能够让它工作......这是你需要做的:

1) Create a new class file in a Util directory or somewhere

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) Then...where ever you start the RemoteWeDriver, replace with this code:

2)然后……无论您在哪里启动 RemoteWeDriver,都替换为以下代码:

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

Your screenshots will be stored locally.

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

Hope this helps.

希望这可以帮助。

回答by Alex

I think this is the best way:

我认为这是最好的方法:

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

回答by gffny

The RemoteWebDriver does not implement the TakesScreenShot and the methods described here to cast the instance of RemoteWebDriver to TakesScreenShot will cause a ClassCastException. I'll see if I can find a solution as I'm interested in doing the same.

RemoteWebDriver 不实现 TakesScreenShot,此处描述的将 RemoteWebDriver 实例转换为 TakesScreenShot 的方法将导致 ClassCastException。我会看看我是否能找到解决方案,因为我有兴趣做同样的事情。

The Augmenter will "enhance the interfaces implemented by this instance of WebDriver iff that instance is a RemoteWebDriver". Depending on how the RemoteWebDriver is configured and how the selenium server is running on the remote host, it may be possible to get a screen shot in using the org.openqa.selenium.remote.Augmenter.

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

I've configured the RemoteWebDriver to use DesiredCapabilities.htmlUnit() capabilities and this gives an ClassCastError. If the RemoteWebDriver is configured with the capabilities of a driver that implements the TakesScreenshot interface, then a ClassCastException may not occur, though I have yet to test this.

我已将 RemoteWebDriver 配置为使用 DesiredCapabilities.htmlUnit() 功能,这会产生 ClassCastError。如果 RemoteWebDriver 配置了实现 TakesScreenshot 接口的驱动程序的功能,那么 ClassCastException 可能不会发生,尽管我还没有对此进行测试。

From the TakesScreenshot interface, the known implementing drivers are: AndroidDriver, AndroidWebDriver, ChromeDriver, EventFiringWebDriver, FirefoxDriver, InternetExplorerDriver, IPhoneDriver, IPhoneSimulatorDriver, and SafariDriver

从 TakesScreenshot 界面来看,已知的实现驱动程序有:AndroidDriver、AndroidWebDriver、ChromeDriver、EventFiringWebDriver、FirefoxDriver、InternetExplorerDriver、IPhoneDriver、IPhoneSimulatorDriver 和 SafariDriver