截取模态窗口的屏幕截图会生成黑色图像

时间:2017-05-25 20:01:54

标签: java selenium testing automated-tests screenshot

我在Eclipse下使用IE11和Java。我在远程系统上运行测试,我也没有使用RDC。此测试在我的本地计算机上运行。

当我尝试拍摄以下屏幕的快照时,Selenium似乎遇到了问题。

Selenium cannot take a screenshot of this modal

这是执行以下代码时的作用:

File scrFile = ((TakesScreenshot) webdr).getScreenshotAs(OutputType.FILE);
  1. 它将模态窗口向上和向左移动。因此,如果原始窗口位置为(5,5),则将其移动到(4,4)
  2. 播放“闹钟”声音 - (叮!)
  3. 这样做大约三次,然后继续下一个陈述。

    截屏过程的结果是黑色图像。 enter image description here

    以下是我在拍摄屏幕截图时调用的实际方法:

    public String captureScreenShot() {
        String      screenShotLocation  = System.getProperty("user.dir");
        String      TCID                = GlobalVars.getInstance().getTCID();
        WebDriver   webdr               = GlobalVars.getInstance().getWebdr();
        String      screenshotDir       = GlobalVars.getInstance().getScreenshotDir();
        String      methodName          = getCallingMethod(0);
        String      screenShotName      = null;
    
    
    // I'm using the test case ID as the directory name where the image will be stored.
    if (screenshotDir == null) {
        if (TCID.toLowerCase().contains("like")) {
            String[] parsedName = TCID.split(" ");
            screenshotDir = parsedName[1];
        } else {
            screenshotDir = TCID;
        }
    }
    
    try {
        File scrFile = ((TakesScreenshot) webdr).getScreenshotAs(OutputType.FILE);
    
        screenShotName          = generateUniqueValue().retStringValue + ".png";
        String[] pathSections   = GlobalVars.getInstance().getLogDir().split("\\\\");
        pathSections[pathSections.length-1] = "";
    
        String path = "";
        for (int x = 0; x < pathSections.length-1; x++) {
            path = path + pathSections[x] + "\\";
        }
    
        screenShotLocation  = path + "screenshots\\" + screenshotDir +"\\" + screenShotName;
        FileUtils.copyFile(scrFile, new File(screenShotLocation));
    
    } catch (IOException e) {
        logMessage(MessType.FAIL, "From Common (" + methodName + ") Sorry, Because I received an exception while trying to capture the a screenshot, a screenshot will not be included.", "System Returned: " + e.toString());
    }
    
    return screenShotLocation;
    

    }

    条件恰好在行:

    File scrFile = ((TakesScreenshot) webdr).getScreenshotAs(OutputType.FILE);
    

    GlobalVars是一个单例类,主要是Setters和Getters。这是代码:

    /**
     * The GlobalVars class is a singleton class that provides the ability to set global variables during the execution of a script.
     * @author lgonzalez
     * @since Dec 10, 2015
     */
    public static class GlobalVars {
        private static GlobalVars instance;
    
        public static GlobalVars getInstance() {
            if (instance == null) {
                instance = new GlobalVars();
            }
            return instance;
        }
        private String          currentTestCaseID;
        private String          screenshotDir;
        private WebDriver       webdr;
        private String          LogDir;
        private BufferedWriter  bfWritter;
        private FileWriter      flWriter;
        private LogFileHandler  fileHandler;
        private int             logLevel;
        private int             passed;
        private int             failed;
    
        // I create a variable containing the LogHandler class when the singleton class is invoked
        private GlobalVars() {
            fileHandler = new LogFileHandler(); 
        }
    
        //---------------------------------------------------
        //         G E T T E R S
        //---------------------------------------------------
        public BufferedWriter getbfWriter() {
            return bfWritter;
        }
    
        public FileWriter getflWriter() {
            return flWriter;
        }
    
        public String getLogDir() {
            return LogDir;
        }       
    
        public LogFileHandler getLogHandler() {
            return fileHandler;
        }
    
        public int getLogLevel() {
            return logLevel;
        }   
    
        public String getScreenshotDir() {
            return screenshotDir;
        }
    
        public String getTCID() {
            return currentTestCaseID;
        }
    
        public WebDriver getWebdr() {
            return webdr;
        }
    
        public int getPassed() {
            return passed;
        }
    
        public int getFailed() {
            return failed;
        }
    
        //---------------------------------------------------
        //         S E T T E R S 
        //---------------------------------------------------
    
        public void setbfWriter(BufferedWriter bfwritter) {
            this.bfWritter = bfwritter;
        }
    
        public void setflWriter(FileWriter flwriter) {
            this.flWriter = flwriter;
        }   
    
        public void setLogDir(String logDir) {
            this.LogDir = logDir;
        }
    
        public void setLogLevel(int loglevel) {
            this.logLevel = loglevel;
        }   
    
        public void setScreenshotDir(String screenshotDir) {
            this.screenshotDir = screenshotDir;
        }
    
        public void setTCID(String currentTestCaseID) {
            this.currentTestCaseID = currentTestCaseID;
        }   
    
        public void setWebdr(WebDriver webdr) {
            this.webdr = webdr;
        }       
    
        public void setPassed(int passed) {
            this.passed = passed;
        }
    
        public void setFailed(int failed) {
            this.failed = failed;
        }
    }
    

    至于FileUtils。此类是作为org.apache.commons.io.FileUtils

    的一部分导入的

1 个答案:

答案 0 :(得分:0)

我无法解决这个具体问题,但我找到了一个更好的解决方案。我使用了Java的Robot类,所以我替换了Selenium的方法:

 File scrFile = ((TakesScreenshot) webdr).getScreenshotAs(OutputType.FILE);

使用以下机器人代码:

        try {
        Robot       robot   = new Robot();
        Dimension   scrSize = Toolkit.getDefaultToolkit().getScreenSize();

        //Create the image 
        BufferedImage exportImage = robot.createScreenCapture(new Rectangle(0, 0, (int) scrSize.getWidth(), (int) scrSize.getHeight()));

        //Get graphics - Get the layer we can actually draw on
        Graphics2D imageGraphics = (Graphics2D) exportImage.getGraphics();

        //Cleanup after ourselves
        imageGraphics.dispose();

        screenShotName          = generateUniqueValue().retStringValue + ".png";
        String[] pathSections   = GlobalVars.getInstance().getLogDir().split("\\\\");
        pathSections[pathSections.length-1] = "";

        String path = "";
        for (int x = 0; x < pathSections.length-1; x++) {
            path = path + pathSections[x] + "\\";
        }

效果更好。