3

在 Grid 上运行的多个实例如何处理 Selenium 屏幕截图?假设我有一个 Grid Hub 驱动一个 Grid 节点,在一台 Node 机器上同时运行 3 个 Firefox 浏览器,我如何从 3 个节点线程中的每个线程中获取 3 个不同的屏幕截图

例如,以这个用于单线程测试的代码片段为例:

RemoteWebDriver driver;
driver = new RemoteWebDriver(new URL("http://127.1/wd/hub"), DesiredCapabilities
    .firefox() );
driver.get( "http://www.google.com/" );
WebDriver augmentedDriver = new Augmenter().augment(driver);
File screenshot = (TakesScreenshot)augmentedDriver.getScreenshotAs(OutputType
    .FILE);
System.out.println( "Page title is: " + driver.getTitle() );
System.out.println( "Screenshot is located at: " + screenshot.getAbsolutePath());
assertTrue( "Page did not contain string.", driver.getSource().contains( 
    "search") );
driver.quit();
4

4 回答 4

3

它会工作得很好。

屏幕截图实际上是该特定驱动程序实例的图像,而不是遗传桌面图像。您不会在每个屏幕截图中看到多个浏览器

于 2013-09-01T06:42:27.713 回答
2

首先,Selenium/WebDriver/Selenium Grid它不会为您处理多线程,您的底层测试框架(TestNG/JUnit/Cucumber等)会处理它。WebDriver 不是线程安全的,如果您正在并行运行测试,则需要确保您的代码是线程安全的。

回到您的问题,您编写的代码将覆盖同一个屏幕截图文件。您需要将文件复制到其他名称不同的地方。我建议您在屏幕截图文件前面加上毫秒精度的时间戳,然后复制屏幕截图文件。这样,您将为三个不同的浏览器实例提供三个独特的不同屏幕截图。这在过去对我有用。

File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
String file_name = "screenshot_"+ Add system_time with millisecond precision 
FileUtils.copyFile(scrFile, new File(file_name));
于 2013-09-02T00:46:00.833 回答
2

这是我的实用程序代码中的一个片段,它工作得很好

  String path = null;
try {
        File source = ((TakesScreenshot)
                driver).getScreenshotAs(OutputType.FILE);
        Calendar currentDate = Calendar.getInstance();
        SimpleDateFormat formatter = new SimpleDateFormat(
                "yyyy/MMM/dd HH:mm:ss");
        String dateN = formatter.format(currentDate.getTime()).replace("/","_");
        String dateNow = dateN.replace(":","_");
        String snapShotDirectory = Files.screenShotDirectory  + dateNow;

        File f = new File(snapShotDirectory);
        if(f.mkdir()){
        path = f.getAbsolutePath() + "/" + source.getName();
        FileUtils.copyFile(source, new File(path)); 
        }
    }
    catch(IOException e) {
        path = "Failed to capture screenshot: " + e.getMessage();
    }

您可以尝试使用它。

于 2013-09-02T05:58:51.903 回答
0

捕获您需要使用不同名称将文件复制到其他地方的屏幕截图。以下代码对您有所帮助。

创建任何名称的方法。我在这里创建 captureScreenshot 方法。

 public static void captureScreenshot(String path) throws IOException{
    try{
        File scrFile= ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);

        FileUtils.copyFile(scrFile, new File(path) );
    }
    catch (Exception e){
        System.out.println("Failed to capture screenshot");
   }

}

然后在您要截屏的方法中使用此方法。请参考以下代码行。在这里,我使用系统当前时间(以毫秒为单位)来保存具有不同名称的多个图像。

captureScreenshot("././screenshots/loginerror_" + System.currentTimeMillis()+".jpg");
于 2013-12-06T04:06:09.967 回答