Как сделать скриншот приложения без строки состояния с помощью Appium

Детали среды

  1. Аппиум Версия 1.7
  2. Android-версия Нуга

И ниже мой код

    public class CaptureScreenShot {
    AppiumDriver<WebElement> driver;
 Dimension size;
 String destDir;
 DateFormat dateFormat;
 BufferedImage expectedImage;
 BufferedImage actualImage;

 @BeforeTest
 public void setUp() throws Exception {
     DesiredCapabilities dc = new DesiredCapabilities();
        dc.setCapability(CapabilityType.BROWSER_NAME,"Android");
        dc.setCapability(CapabilityType.VERSION,"7.0");
        dc.setCapability("deviceName","ce041714c44ebd1802");
        dc.setCapability("platformName", "Android");
        dc.setCapability("appPackage", "io.ionic.starter");
        dc.setCapability("appActivity", "io.ionic.starter.MainActivity");
                try {
                    driver= new AppiumDriver<WebElement>(new URL("http://127.0.0.1:4723/wd/hub"), dc);
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                }
        driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

 }

 @Test
 public void ScrollToTab() {
  takeScreenShot();

 }

 public void takeScreenShot() {
   destDir = "<<local path>>\";

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

  dateFormat = new SimpleDateFormat("dd-MMM-yyyy__hh_mm_ssaa");

  new File(destDir).mkdirs();

  String destFile = dateFormat.format(new Date()) + ".png";

  try {

   FileUtils.copyFile(scrFile, new File(destDir + "/" + destFile));
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
 @Test
 public void verify(){
     try {
        expectedImage = ImageIO.read(new File("<local path>"));
    } catch (IOException e) {
      e.printStackTrace();
    }
     try {
        actualImage = ImageIO.read(new File("<local path>"));
    } catch (IOException e) {
        e.printStackTrace();
    }
     ImageDiffer imgDiff = new ImageDiffer();
     ImageDiff diff = imgDiff.makeDiff(expectedImage, actualImage);
     Assert.assertFalse(diff.hasDiff(),"Images are Same");
 }

 @AfterTest
 public void End() {
  driver.quit();
 }
}

Этот код работает нормально, но вместе со снимком экрана строка состояния Android также захватывается, и тесты не выполняются, поскольку элементы экрана состояния являются динамическими. может ли кто-нибудь помочь мне сделать снимок экрана, не включая строку состояния.


person Kiran Antony    schedule 15.11.2017    source источник


Ответы (1)


Этот код может решить вашу проблему, взяв субизображение из полного снимка экрана:

import io.appium.java_client.AppiumDriver;
import org.openqa.selenium.*;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.IOException;

AppiumDriver driver;
By locator = By.xpath("(//android.widget.FrameLayout)[1]");
// in my case this locator match everything except status bar

public BufferedImage getSubImage() throws IOException {
    final byte[] srcImage = ((TakesScreenshot) driver).
      getScreenshotAs(OutputType.BYTES);
    final BufferedImage screenshot = ImageIO.read(    
      new ByteArrayInputStream(srcImage));

    final WebElement element = driver.findElement(locator);
    final Point elementLocation = element.getLocation();
    final Dimension elementSize = element.getSize();
    return screenshot.getSubimage(elementLocation.x, elementLocation.y,
      elementSize.width, elementSize.height);
}
person dmle    schedule 17.11.2017
comment
Спасибо за ответ. Я проверю и дам вам знать. - person Kiran Antony; 27.11.2017