Сделайте снимок экрана в раскрывающемся списке селена С#
Я хотел бы снять снимок экрана параметров, отображаемых в раскрывающемся списке, используя 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()
.
И у меня есть еще один вопрос. Возможно ли, чтобы селен щелкнул и расширился некоторое время, пока не захватил экран?
Любая помощь будет принята с благодарностью.
Ответы
Ответ 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);
}