Проблема со скриншотами на удаленном сервере

Здравствуйте.
Использовался saucelabs и в скриншотах не было необходимости. В связи с настройкой своего сервера нужно мне научиться делать скриншоты.
Прошу сильно не пинать, но я только начинаю автоматизировать и программировать.
Тесты я записываю в selenium builder и там есть команда снятия скриншота, но она не работает в RemoteWebDriver

Ниже код одного теста. Мне нужна помощь:

  1. как сделать скриншот при фейле данного теста?

  2. как сделать скриншот в любом произвольном месте теста командой?

    import org.apache.commons.io.FileUtils;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.AfterClass;
    import org.junit.BeforeClass;
    import org.junit.Test;
    import static org.junit.Assert.*;

    import java.io.IOException;
    import java.net.URL;
    import java.text.MessageFormat;
    import java.util.Calendar;
    import java.util.concurrent.TimeUnit;
    import java.util.Date;
    import java.io.File;

    import org.openqa.selenium.remote.Augmenter;
    import org.openqa.selenium.remote.DesiredCapabilities;
    import org.openqa.selenium.remote.RemoteWebDriver;
    import org.openqa.selenium.support.ui.Select;
    import org.openqa.selenium.interactions.Actions;
    import org.openqa.selenium.firefox.FirefoxDriver;
    import org.openqa.selenium.;
    import static org.openqa.selenium.OutputType.
    ;

    public class firefox_Test {
    public WebDriver wd;

     @Before
     public void setUp() throws Exception {
         DesiredCapabilities caps = DesiredCapabilities.firefox();
          caps.setCapability("name", "just test");
          wd = new RemoteWebDriver(
                 new URL("http://********:4444/wd/hub"),caps);
         }
    
     @Test
     public void firefox_Test() {
         wd.get("http://*******");
         wd.findElement(By.name("_username")).click();
         wd.findElement(By.name("_username")).click();
         wd.findElement(By.name("_username")).clear();
         wd.findElement(By.name("_username")).sendKeys("test@********");
         wd.findElement(By.name("_password")).click();
         wd.findElement(By.name("_password")).clear();
         wd.findElement(By.name("_password")).sendKeys("666");
         wd.findElement(By.id("enter")).click();
         assertTrue(wd.findElement(By.tagName("html")).getText().contains("Неверно указана пара логин/пароль"));
         //wd.getScreenshotAs(FILE).renameTo(new File("/home/black/Pictures/555.png"));
         wd.findElement(By.linkText("Забыли пароль?")).click();
         if (!wd.findElement(By.tagName("html")).getText().contains("Восстановить")) {
             System.out.println("verifyTextPresent failed");
         }
         wd.findElement(By.linkText("Я вспомнил!")).click();
         wd.findElement(By.name("_password")).click();
         wd.findElement(By.name("_password")).clear();
         wd.findElement(By.name("_password")).sendKeys("555");
         wd.findElement(By.id("enter")).click();
         if (!wd.findElement(By.tagName("html")).getText().contains("Реклама")) {
             System.out.println("verifyTextPresent failed");
         }
         wd.get("https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0");
         wd.findElement(By.linkText("Случайная статья")).click();
         String superlink = wd.getCurrentUrl();
         wd.get("http://******");
         wd.findElement(By.id("insertLink")).click();
         wd.findElement(By.id("insertLink")).click();
         wd.findElement(By.id("insertLink")).click();
         wd.findElement(By.id("insertLink")).clear();
         wd.findElement(By.id("insertLink")).sendKeys(superlink);
         wd.findElement(By.id("cutter")).click();
         try { Thread.sleep(200l); } catch (Exception e) { throw new RuntimeException(e); }
         wd.findElement(By.id("copyLink")).click();
         String supershort = wd.findElement(By.cssSelector("div.short-link > a")).getText();
         wd.get(supershort);
         if (!wd.findElement(By.tagName("html")).getText().contains("Описание Википедии")) {
             System.out.println("verifyTextPresent failed");
         }
     }
    
     @After
     public void tearDown() {
         wd.quit();
     }
    
     public static boolean isAlertPresent(FirefoxDriver wd) {
         try {
             wd.switchTo().alert();
             return true;
         } catch (NoAlertPresentException e) {
             return false;
         }
     }
    

    }

Нашел как делать скриншот.
Это просто как отдельный шаг в тесте.
Вместо вот вот такой строки которую делает selenium builder при импорте в junit^

wd.getScreenshotAs(FILE).renameTo(new File(“C:\Users\Serl\Downloads\555.png”));

Вставляем такой код

wd = new Augmenter().augment(wd);
File srcFile = ((TakesScreenshot) wd).getScreenshotAs(OutputType.FILE);
try {
FileUtils.copyFile(srcFile, new File("/home/black/Pictures/777.png"));
} catch (IOException e) {
e.printStackTrace();
}

Теперь осталось научиться как делать скрин при падении.

1 лайк

При падении, очевидно, вылетает какой-то эксепшн. В том месте, где он ловится, и делайте скриншот.

java.lang.AssertionError
at org.junit.Assert.fail(Assert.java:92)
at org.junit.Assert.assertTrue(Assert.java:43)
at org.junit.Assert.assertTrue(Assert.java:54)

Каким образом поймать такое?

Через связку try - except

Для JUnit-а - правилом.
http://junit.org/apidocs/org/junit/rules/TestWatcher.html

Я создал класс TakeElementScreenshot с правилом:

public class TakeElementScreenshot extends TestWatcher {
WebDriver wd;

public TakeElementScreenshot(WebDriver wd) {
    this.wd = wd;
}
@Override
public void failed  (Throwable e, Description description) {
     date = new Date(System.currentTimeMillis());
    SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy hh_mm_ss");
    File srcFile = ((TakesScreenshot) wd).getScreenshotAs(OutputType.FILE);
    try {
        FileUtils.copyFile(srcFile, new File("C:\\Users\\Serl\\Downloads\\ok\\" + sdf.format(date) + ".png"));
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
}

}

Добавил правило в тестовый класс

@Rule
public TakeElementScreenshot takeElementScreenshot = new TakeElementScreenshot(wd);

Теперь когда проверка не проходит:

assertTrue(wd.findElement(By.tagName(“html”)).getText().contains(“Неверно указана пара логин/пароль”));

Вот такое сообщение выдается:

java.lang.NullPointerException
at TakeElementScreenshot.failed(TakeElementScreenshot.java:52)
at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:52)

Ругается на вот эту строку:

File srcFile = ((TakesScreenshot) wd).getScreenshotAs(OutputType.FILE);

Подскажите, что я делаю не так?

Похоже, что вебдрайвер передается в конструктор правила до того, как он инициализирован.

Вообще не понимаю куда смотреть. Может быть я что-то лишнее написал в коде?

Нашел пример со скриншотом exemplo-screenshots-junit-testng/exemplo-screenshots-junit-testng/src/test/java/exemplo/screenshots/junit at master · stefanteixeira/exemplo-screenshots-junit-testng · GitHub

Попробую его

Попробовал пример выше и всё получилось.
Всём спасибо за помощь

Попробуйте @AfterMethod , у меня работает

@AfterMethod (alwaysRun = true)
public void takeScreenShotOnFailure(ITestResult testResult) throws IOException {
if (testResult.getStatus() == ITestResult.FAILURE) {

    String screenStoreToPath = properties.getProperty(getEnvironment() + "." + EnvironmentPropertiesHandler.STORE_SCREEN_TO);
    if (!screenStoreToPath.equals(null)) {
        String separator = properties.getProperty(getEnvironment() + "." + EnvironmentPropertiesHandler.USE_REMOTE_WEBDRIVER).equals("true") ? "/" : "\\";
        String dateFormat = new SimpleDateFormat("yyyyMMdd").format(new Date()).toString();
        String timeFormat = new SimpleDateFormat("hh.mm.ss").format(new Date()).toString();
        String testName = testResult.getMethod().getTestClass().getRealClass().getSimpleName();
        File scrFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
        File createScreen = new File(screenStoreToPath + separator + dateFormat + separator + testName + "_" + timeFormat + ".jpg");   //вот это кастомное, настроил под себя
        FileUtils.copyFile(scrFile, createScreen);
    }
}

}

Кто ж так на null проверяет?

NPE вам тут гарантирован в случае отсутствия проперти.

if (screenStoreToPath != null) {