code: public ScreenCaptureReply captureScreen(long timeout, List<String> knownMD5s)
        throws OperaRunnerException {
      assertLauncherAlive();
  
      String resultMd5;
      byte[] resultBytes;
      boolean blank = false;
  
      try {
        LauncherScreenshotRequest.Builder request = LauncherScreenshotRequest.newBuilder();
        request.addAllKnownMD5S(knownMD5s);
        request.setKnownMD5STimeoutMs((int) timeout);
  
        ResponseEncapsulation res = protocol.sendRequest(
            MessageType.MSG_SCREENSHOT, request.build().toByteArray());
        LauncherScreenshotResponse response = (LauncherScreenshotResponse) res.getResponse();
  
        resultMd5 = response.getMd5();
        resultBytes = response.getImagedata().toByteArray();
  
        if (response.hasBlank()) {
          blank = response.getBlank();
        }
      } catch (SocketTimeoutException e) {
        throw new OperaRunnerException("Could not get screenshot from launcher", e);
      } catch (IOException e) {
        throw new OperaRunnerException("Could not get screenshot from launcher", e);
      }
  
      ScreenCaptureReply.Builder builder = ScreenCaptureReply.builder();
      builder.setMD5(resultMd5);
      builder.setPNG(resultBytes);
      builder.setBlank(blank);
      builder.setCrashed(this.hasOperaCrashed());
      return builder.build();
    }
docs: Take screenshot using external program.  Will not trigger a screen repaint.
  
  @throws OperaRunnerException if runner is shutdown or not running
  @inheritDoc