2015-11-20 37 views
11

以下に表示される画像のように、セレニウムc#を使用してドロップダウンに表示されるオプションのスクリーンショットをキャプチャしたいと思います。セレンのドロップダウンメニューのスクリーンショットを取るC#

enter image description here

私は、スクリーンショットを撮るには複数の方法を試してみました。基本的には、スクリーンショットをキャプチャするために要素のドロップダウンを拡張しています。私は

//#1 
var element = Driver.FindElement(By.Id("carsId")); 
Actions builder = new Actions(Driver); 
builder.SendKeys(element, Keys.LeftAlt + Keys.Down).Build().Perform(); 

//#2 
Actions act = new Actions(Driver); 
act.MoveToElement(element).Build().Perform(); 

をやった私は、サイト上で行ってきたが、セレンを介して動作しませんでしたときここでAltキー + Downキーを押して最初の実装は、手動で働いています。 2番目の実装はうまくいきませんでした。私もbuilder.ClickAndHold()メソッドを試してみました。

ここでもう1つの質問があります。セレンがクリックして画面をつかむまでしばらく拡張することは本当に可能ですか?

ご協力いただければ幸いです。

+0

オプションのテキストをプルして、ログの代わりにログに書きたくない理由はありますかスクリーンショット? – JeffC

+0

@JeffCドロップダウンのオプションをプルダウンしてログに書き込むことができますが、クライアントにはオプションリストのスクリーンショットが必要です –

+0

@KarthikChintalaスクリーンショットはすでに撮っていますか?問題は何ですか? – Manu

答えて

2

通常のドロップダウンは可能ではないでしょうか。選択可能なオプションのオーバーレイは、ネイティブコントロールの内部に表示され、セレンの機能とは関係がありません。このためには、自分自身のデスクトップやアプリケーションのスクリーンショットをキャプチャできる別のプロセスやツールが必要です。今

Link

、デスクトップ/アプリケーションのスクリーンショットをキャプチャする、我々はJavaでRobotオブジェクトを使用します。

C#の場合、Capture screenshot of active window?で提案されている方法を使用できます。

ロボットサンプルコード:

try { 

    //Get the size of the screen stored in toolkit object 
    Toolkit tk = Toolkit.getDefaultToolkit(); 
    Dimension d = tk.getScreenSize(); 

    //Create Rectangle object using height and width of screen 
    //Here entire screen is captured, change it if you need particular area 
    Rectangle rect = new Rectangle(0, 0, d.width, d.height); 

    //Creates an image containing pixels read from the screen 
    Robot r = new Robot(); 
    BufferedImage img = r.createScreenCapture(rect); 

    //Write the above generated buffered image to a file 
    File f = new File("myimage.jpg"); 

    //Convert BufferedImage to a png/jpg image 
    ImageIO.write(img, "jpg", f); 

} catch (Exception e) { 
    System.out.println(e.getMessage()); 
} 

これは画面全体のスクリーンショットを取ると、指定したファイルの場所にファイルに保存します。

Seleniumは、Javascript/CSSを使用して選択したドロップダウンではなくカスタムドロップダウンのオプションのスクリーンショットを取ることができます。

上記のコードが機能しているか、さらにヘルプが必要な場合は教えてください。

+0

あなたの答えManuに感謝します。私はページ全体と特定の要素のスクリーンショットを撮っていることを知っています。私はあなたが答えで取り上げた引用を読んだ。ドロップダウンをクリックして拡大してページのスクリーンショットを撮るための他の方法があると思った。 –

+0

セレンを使って拡張ドロップダウンメニューを使ってスクリーンショットを撮ることはできません。それが限界です。 – Manu

+0

お世話になりました。私はドロップダウンのオプションをクリックすることに成功しましたが、セレニウムはオプションを拡張してページのスクリーンショットをつかむことができません。そして、ええ、セレンはそれらのスクリーンショットをつかむことができないように見えます。 –

1

ドロップダウンを開くには、要素を.Click()にするだけです。あなたの場合、

IWebElement element = Driver.FindElement(By.Id("carsId")); 
element.Click(); 

はドロップダウンを展開します。問題は、Seleniumのスクリーンショット機能が開いているドロップダウンをキャプチャしないということです。 .NETを使用してアクティブなウィンドウのスクリーンショットを撮るだけで、それを回避することができます。以下の作業例のコード。

static void Main(string[] args) 
{ 
    IWebDriver Driver = new FirefoxDriver(); 
    Driver.Navigate().GoToUrl("http://www.tutorialspoint.com/html/html_select_tag.htm"); 
    Driver.Manage().Window.Maximize(); 
    IWebElement element = Driver.FindElement(By.Name("dropdown")); 
    element.Click(); 
    TakeScreenShotOfWindow(@"C:\sshot.png"); 
} 

// from http://stackoverflow.com/a/363008/2386774 
public static void TakeScreenShotOfWindow(string filePath) 
{ 
    // Create a new bitmap. 
    var bmpScreenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb); 

    // Create a graphics object from the bitmap. 
    var gfxScreenshot = Graphics.FromImage(bmpScreenshot); 

    // Take the screenshot from the upper left corner to the right bottom corner. 
    gfxScreenshot.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy); 

    // Save the screenshot to the specified path that the user has chosen. 
    bmpScreenshot.Save(filePath, ImageFormat.Png); 
} 
+0

これは気難しいものです:-)これは画面のスクリーンショットであり、ブラウザウィンドウではなく、ブラウザウィンドウが別の画面(セカンダリモニタ...)にある可能性があります。 –

+0

OK ...ブラウザが画面上にある場合は、ブラウザのスクリーンショットです。 :)はい、ブラウザが別の画面で動作する可能性があります。私の推測では、それは研究室のマシン上で実行され、たぶん1台のモニターしか持っていないでしょう。また、ブラウザが表示される画面を制御することもできます。簡単な方法は機能しませんが、これは質問に対する答えとして満足しており、実装が非常に簡単です。 – JeffC

+0

古い投稿ですが、これは実際にはC#で見た中で最も良い解決策です。一般的に引用されているScreenshot.Cloneメソッドを使用すると、メモリ不足例外が発生することがありますが、この方法では発生しません。要素のX&Y値などを使用して、画面全体ではなく特定の要素のスクリーンショットを撮るためにも使用できます – Phonesis

2

これは本当に簡単です。追加ツールなしでも、私を信じてください。

必要なのは、選択要素をクリックした後、次の手順を実行することです:

  1. メイクページのスクリーンショット
  2. はあなたの選択要素の位置(ページ上の座標)
  3. は最後のオプション要素をゲット位置
  4. は、最後のオプション要素サイズ
  5. が位置して新しいRectangleを作成する]を選択しており、

    と同じを取得します

    var screenshotSize = lastOption.Position - Select.Position;

    screenShotSize.height + = lastOption.Size.Height;

  6. カットオフすべてのあなたは#6次のコード

    Bitmap ScreenshotOfSelect = browserScreenshot.Clone(new Rectangle(point, size), screen.PixelFormat); 
    

    、結果として、あなたが受け取るビットマップのために使用することができるのC#の場合はスクリーンショット

からこのRectangleの代わりに、ちょうどあなたが参照してください、その本当に本当に簡単に=)とあなたはセレンを除いて、ツールを必要としないので、選択した= =

また、ブラウザウィンドウは現時点では表示されません(例としてphantomJSを使用している場合)

関連する問題