首页 > 解决方案 > 如何将图像复制到 Selenium 中的剪贴板?

问题描述

我正在编写一个测试,我需要复制的功能本质上是将图像保存到剪贴板并稍后粘贴。我正在使用 Selenium WebDriver v3.11.1。

我曾尝试使用 ContextClick 以多种方式复制图像,但它从来没有完全做到我想要的,例如:

Actions rightClickAction = new Actions(driver);
rightClickAction.MoveToElement(logo).ContextClick(logo).SendKeys(Keys.ArrowDown).SendKeys(Keys.ArrowDown).SendKeys(Keys.ArrowDown).SendKeys(Keys.Enter).Build().Perform();

但是向下/输入箭头从未起作用,因为它没有专注于右键菜单。然后我发现了这个错误https://bugs.chromium.org/p/chromedriver/issues/detail?id=1003这让我觉得我不能使用上下文单击来复制图像。我也不能只是'ctrl + c'图像。

然后我了解到我可以剪贴板,但我无法从我的目录中设置图像:

Clipboard.SetImage(Image.FromFile("C://Image.png"));

然后,我尝试按照此处的操作截取屏幕截图:C# Selenium - How do you take a screenshot in Visual Studio 2015并且两者都不起作用。尝试保存屏幕截图文件并将其添加到“剪贴板”变得混乱。

我还尝试通过使用由 webdriver 执行的 JavaScript 获取图像的 base64 字符串,然后将图像的 base64 字符串保存到文件中来从页面中抓取图像,我在这里找到了该文件:Using selenium to save images from page

这也变得一团糟,我不知道如何将其保存到剪贴板。

那么,如何将图像保存到剪贴板?

标签: c#selenium-webdriver

解决方案


您可以尝试类似的方法:

    driver.get("https://stackoverflow.com/");
    WebElement element = driver.findElement(By.xpath("//span[(text()='Stack Overflow') and @class='-img _glyph']"));
    WrapsDriver wrapsDriver = (WrapsDriver) element;
    File screenshot = ((TakesScreenshot) wrapsDriver.getWrappedDriver()).getScreenshotAs(OutputType.FILE);
    Rectangle rectangle = new Rectangle(element.getSize().width, element.getSize().height, element.getSize().height, element.getSize().width);
    Point location = element.getLocation();
    BufferedImage bufferedImage = ImageIO.read(screenshot);
    BufferedImage destImage = bufferedImage.getSubimage(location.x, location.y, rectangle.width, rectangle.height);
    ImageIO.write(destImage, "png", screenshot);
    File file = new File("C:\\tmp\\123.png");
    FileUtils.copyFile(screenshot, file);

请让我知道这对你有没有用


推荐阅读