Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 拍摄selenium c中下拉菜单中选项的屏幕截图_C#_Selenium_C# 4.0_Drop Down Menu_Screenshot - Fatal编程技术网

C# 拍摄selenium c中下拉菜单中选项的屏幕截图

C# 拍摄selenium c中下拉菜单中选项的屏幕截图,c#,selenium,c#-4.0,drop-down-menu,screenshot,C#,Selenium,C# 4.0,Drop Down Menu,Screenshot,我想用selenium c捕获下拉列表中显示的选项的屏幕截图,就像下面显示的图像一样 我尝试了多种方法来拍摄截图。基本上,我必须展开元素的下拉列表来捕获屏幕截图。这就是我所做的 //#1 var element = Driver.FindElement(By.Id("carsId")); Actions builder = new Actions(Driver); builder.SendKeys(element, Keys.LeftAlt + Keys.Down).Build().Perfor

我想用selenium c捕获下拉列表中显示的选项的屏幕截图,就像下面显示的图像一样

我尝试了多种方法来拍摄截图。基本上,我必须展开元素的下拉列表来捕获屏幕截图。这就是我所做的

//#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方法

我还有一个问题。selenium真的可以单击并展开一段时间,直到抓住屏幕吗

任何帮助都将不胜感激

我认为正常的下拉列表是不可能的。因为您可以从中选择选项的覆盖显示在本机控件内,并且不在selenium可以使用的上下文中。为此,您需要一些单独的流程或工具来捕获桌面或应用程序的屏幕截图

现在,为了捕获桌面/应用程序的屏幕截图,我们使用Java中的对象

对于C,可以使用中建议的方法

机器人示例代码:

这将获取整个屏幕的屏幕截图,并将其保存到给定文件位置的文件中

Selenium只能在使用Javascript/CSS创建的自定义下拉列表中截取选项,而不能在选择下拉列表中截取选项


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

要打开下拉列表,只需单击该元素即可。所以在你的情况下

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);
}

相信我,这真的很容易做到,不需要任何额外的工具

单击“选择元素”后,只需执行以下步骤:

制作网页截图 获取Select元素在页面上的坐标位置 获取最后一个选项元素位置 获取最后一个选项元素大小 创建新矩形,其位置与选择和

var screenshotSize=lastpoption.Position-Select.Position

screenShotSize.height+=lastOption.Size.height

从屏幕截图中删除除此矩形以外的所有矩形

在使用c的情况下,您可以将以下代码用于6

Bitmap ScreenshotOfSelect = browserScreenshot.Clone(new Rectangle(point, size), screen.PixelFormat);
结果,您将收到仅包含展开选择的位图=


如您所见,这真的很容易做到,除了selenium,您不需要任何工具。此外,浏览器窗口目前可能不可见,例如在使用phantomJS的情况下,

是否有什么原因使您不想将选项的文本拉到日志而不是屏幕截图中?@JeffC我能够拉到下拉列表中的选项并将其写入日志,但我的客户需要一张options@KarthikChintala你已经拍过截图了吗?有什么问题吗?@Manu我没有。我想。问题在于使用下拉选项截图。我不需要选项列表,但需要这些选项的屏幕截图,如图所示。@KarthikChintala您可以添加屏幕外观和选项的DOM结构吗?另外,我知道你只需要网页元素截图,对吗?谢谢你的回答。我知道为整个页面和特定元素截图。我已经读了你在回答中提到的那句话。我想如果有其他方法可以点击下拉菜单,使其展开,然后拍摄页面的屏幕截图,问题是你不能使用selenium使用展开的select下拉菜单拍摄屏幕截图。这就是限制。谢谢你的努力。我确实成功地点击了下拉列表中的选项,但selenium无法在选项已展开的情况下抓取页面的屏幕截图。是的,看起来selenium无法抓到这些屏幕截图。让我们挑三拣四:-这是屏幕截图,不是浏览器窗口,而且浏览器窗口可能位于另一个屏幕辅助监视器上,…好的。。。如果浏览器在屏幕上,则它是浏览器的屏幕截图:是的,浏览器可能在不同的屏幕上运行。我猜它是在实验室机器上运行的,可能只有一个显示器。您还可以控制浏览器出现在哪个屏幕上。简单的方法不起作用,但这确实满足了问题的答案,而且实现起来非常简单。这是我见过的C的最佳解决方案。使用常用的屏幕截图。克隆方法通常会导致内存不足异常,而这种方法不会。您还可以使用它拍摄特定元素的屏幕截图,而不是使用元素的X&Y值等拍摄整个屏幕
Bitmap ScreenshotOfSelect = browserScreenshot.Clone(new Rectangle(point, size), screen.PixelFormat);