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