try {
out = new FileOutputStream(of);
out.write(new Base64Encoder()
.decode(((ScreenshotException) cause)
.getBase64EncodedScreenshot()));
}
catch (Exception e) {
e.printStackTrace();
}
finally {
try {
out.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
主要看 onException 這個方法的實現(xiàn),很明顯, 我們捕獲了這個異常, 然后通過強制轉(zhuǎn)換將圖片提取出來,寫入硬盤。
然后是使用這個監(jiān)聽器, 通常會在 setup 方法里面將這個監(jiān)聽器注冊到 WebDriver 中去, 看代碼:
@Test
public void setup(){
String remote_driver_url = "http://localhost:4444/wd/hub";
DesiredCapabilities capability = null;
capability = DesiredCapabilities.firefox();
WebDriverEventListener eventListener = new CustomWebDriverEventListener ();
WebDriver driver = new EventFiringWebDriver(new RemoteWebDriver(new URL(
remote_driver_url), capability)).register(eventListener);
}
在這之后,如果運行出錯, WebDriver 拋出異常會在相應的 classpath 下面生成 png 的截圖。
自定義 TestRule
和自定義 WebDriver 監(jiān)聽器不同, 自定義 TestRule 只有在這個 Rule 被執(zhí)行的時候, 才去做一些我們預設(shè)的 CallBack。 所以這個截圖動作,對于 WebDriver 而言, 是主動的。 那么,我們需要自定義一個 RemoteWebDriver 來實現(xiàn)截圖功能。 WebDriver 自身提供了 TakesScreenshot 這個接口, 我們只要實現(xiàn)它可以了, 看代碼:
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 CustomRemoteWebDriver extends RemoteWebDriver implements
TakesScreenshot {
public CustomRemoteWebDriver(URL url, DesiredCapabilities dc) {
super(url, dc);
}
@Override
public X getScreenshotAs(OutputType target)
throws WebDriverException {
if ((Boolean) getCapabilities().getCapability(
CapabilityType.TAKES_SCREENSHOT)) {
return target
.convertFromBase64Png(execute(DriverCommand.SCREENSHOT)
.getValue().toString());
}
return null;
}
}