Подтвердить что ты не робот

Сделайте снимок экрана в раскрывающемся списке селена С#

Я хотел бы снять снимок экрана параметров, отображаемых в раскрывающемся списке, используя selenium С#, как изображение, которое отображается ниже.

введите описание изображения здесь

Я попробовал несколько способов сделать снимок экрана. В основном я должен расширить раскрывающийся элемент для захвата снимка экрана. Вот что я сделал

//#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 работала вручную, когда я делал это на сайте, но не работал через селен. Вторая реализация тоже не работала. Я также пробовал метод builder.ClickAndHold().

И у меня есть еще один вопрос. Возможно ли, чтобы селен щелкнул и расширился некоторое время, пока не захватил экран?

Любая помощь будет принята с благодарностью.

4b9b3361

Ответ 1

Я не думаю, что это будет возможно для нормальных падений. Поскольку наложение с параметрами, которые вы можете выбрать, отображается внутри встроенного элемента управления и вне контекста того, с чем может работать селен. Для этого вам понадобится отдельный процесс или инструмент, который может захватить скриншот рабочего стола или приложения.

Ссылка

Теперь, чтобы сделать снимок экрана рабочего стола/приложения, мы используем Robot объекты в Java.

Для С# вы можете использовать методы, предложенные в Захват скриншота активного окна?.

Пример кода робота:

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, а не в раскрывающемся списке выбора.

Сообщите мне, работает ли над кодом или вам нужна дополнительная помощь.

Ответ 2

Его действительно легко сделать БЕЗ КАКИХ-ЛИБО ДОПОЛНИТЕЛЬНЫХ ИНСТРУМЕНТОВ, поверьте мне.

Все, что вам нужно, это сделать следующие шаги после нажатия кнопки Выбрать:

  • Сделать снимок экрана
  • Получить позицию выбранного элемента (ее координаты на странице)
  • Получить последнее положение элемента Option
  • Получить последний размер элемента Option
  • Создайте новый прямоугольник с позицией так же, как и выберите и

    var screenshotSize = lastOption.Position - Select.Position;

    screenShotSize.height + = lastOption.Size.Height;

  • Отключить все, кроме этого прямоугольника, с экрана

В случае С# вы можете использовать для # 6 следующий код

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

И в результате вы получите растровое изображение, которое содержит ровно только расширенный Select =)

как вы видите, его действительно очень легко сделать =) И вам не нужны никакие инструменты, кроме селена. А также окно браузера может быть невидимым в данный момент (как пример в случае использования phantomJS)

Ответ 3

Чтобы открыть раскрывающийся список, вам нужно только .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);
}