2011-11-23 11 views
1

私はJavaScript executorでカスタムJavaScriptを読み込むSelenium Javaアプリケーションを持っています。同じように私は現在のページにカスタムCSSを読み込むことができます。しかし、私はまた、CSSで参照されるカスタムローカルイメージをロードできるようにしたい。それは可能ですか?ローカル画像をSelenium 2で現在のWebページに挿入/ロード

+0

あなたが ' '?ブラウザは、CSSを処理するときに自動的にそれを行うべきです。 –

+0

Webサーバーが動作していないため、URLを使用できません。私は何とか画像をシリアライズしたり、バイナリ形式を使って直接ソースコードに組み込む必要があります。 – Alp

答えて

1

自分で作成しました。パラメータ:

  • styleDefinitionsは、CSSスタイルシート定義の文字列です。
  • flatImageFolderはブール値です。 trueの場合、相対URLを持つすべてのローカルイメージはsrc/main/resources/imagesフォルダから取得されます。 falseの場合、適切なサブフォルダのフォルダ内に配置する必要があります。

Javaコード:

public class SeleniumTools { 
    public function loadCSS(String styleDefinitions, Boolean flatImageFolder) { 
     Pattern pattern; 
     if(flatImageFolder) { 
      pattern = Pattern.compile("url\\((?:.*?\\/)(.*?).(png|gif)\\)"); 
     } else { 
      pattern = Pattern.compile("url\\(((?:.*?\\/).*?).(png|gif)\\)"); 
     } 
     Matcher matcher = pattern.matcher(styleDefinitions); 
     StringBuffer styleDefinitionsWithInlineImageData = new StringBuffer(); 
     int lastMatchEndPosition = 0; 
     while(matcher.find()) { 
      String filename = matcher.group(1); 
      String extension = matcher.group(2); 
      lastMatchEndPosition = matcher.end(); 
      matcher.appendReplacement(styleDefinitionsWithInlineImageData, "url(" + convertImageToBinaryData(
         SeleniumTools.class.getResourceAsStream("/images/" + filename + "." + extension), extension) + ")"); 
     } 
     // add all definitions from the last match until the end of the stylesheet 
     styleDefinitionsWithInlineImageData.append(styleDefinitions.substring(lastMatchEndPosition)); 
     String script = "jQuery('<style type=\"text/css\">" + styleDefinitionsWithInlineImageData.toString() + "</style>').appendTo('html > head');"; 
     ((JavascriptExecutor) webDriver).executeScript(script); 
    } 

    private static String convertImageToBinaryData(InputStream imageInputStream, String fileExtension) { 
     BufferedImage image; 
     try { 
      image = ImageIO.read(imageInputStream); 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      ImageIO.write(image, fileExtension, baos); 
      return "data:image/" + fileExtension + ";base64," + Base64.encode(baos.toByteArray()); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
} 
関連する問題