在selenium c#中的下拉列表中截取选项的屏幕截图

时间:2015-11-20 04:11:49

标签: c# selenium c#-4.0 drop-down-menu screenshot

我想使用selenium 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 键的实现在我在网站上完成后手动工作但是没有通过selenium工作。第二个实现也不起作用。我也尝试了builder.ClickAndHold()方法。

我在这里还有另外一个问题。是否真的有可能硒点击并扩展一段时间,直到抓住屏幕?

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

  

我不认为正常下降是可能的。由于具有您可以选择的选项的叠加显示在本机控件内,并且在selenium可以使用的上下文之外。为此,您需要一些独立的流程或工具来捕获桌面或应用程序的屏幕截图。

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制作的自定义下拉菜单中的选项,而不是选择下拉列表。

如果上述代码有效或者您需要更多帮助,请告诉我。

答案 1 :(得分:2)

在没有任何其他工具的情况下很容易做到,相信我。

点击选择元素后,您只需执行以下步骤:

  1. 制作页面截图
  2. 获取您的选择元素位置(页面上的坐标)
  3. 获取最后一个选项元素位置
  4. 获取最后一个选项元素大小
  5. 创建一个新的Rectangle,其位置与select和

    相同

    var screenshotSize = lastOption.Position - Select.Position;

    screenShotSize.height + = lastOption.Size.Height;

  6. 从截屏

  7. 中切除除此Rectangle以外的所有内容

    如果是c#,您可以使用#6以下代码

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

    结果您将收到仅包含扩展的Select =)

    的位图

    所以你看,它真的很容易做=)除了硒之外你不需要任何工具。此时浏览器窗口也可以隐藏(例如,在使用phantomJS的情况下)

答案 2 :(得分: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);
}