Java 如何使用Appium在移动应用程序中获取烤面包机消息的文本

Java 如何使用Appium在移动应用程序中获取烤面包机消息的文本,java,appium,ocr,Java,Appium,Ocr,我正在尝试验证Android移动应用程序中的烤面包机消息,但无法获取烤面包机消息的文本,因为它没有显示在uiautomatorviewer中。 得到一些信息,通过OCR的帮助,它可以完成截图和从截图中提取文本 有谁能帮助我在Appium项目中使用java一步一步地完成这项工作吗?请关注Appium论坛上的以下讨论: 验证烤面包机的基本步骤包括: 执行操作以触发toast消息显示在屏幕上 拍摄x个屏幕截图 增加所有屏幕截图的分辨率 使用tessearct OCR检测toast消息 请参阅使用Jav

我正在尝试验证Android移动应用程序中的烤面包机消息,但无法获取烤面包机消息的文本,因为它没有显示在uiautomatorviewer中。 得到一些信息,通过OCR的帮助,它可以完成截图和从截图中提取文本
有谁能帮助我在Appium项目中使用java一步一步地完成这项工作吗?

请关注Appium论坛上的以下讨论:

验证烤面包机的基本步骤包括:

  • 执行操作以触发toast消息显示在屏幕上
  • 拍摄x个屏幕截图
  • 增加所有屏幕截图的分辨率
  • 使用tessearct OCR检测toast消息
  • 请参阅使用Java OCR库(见底部):


    在Appium论坛上进行以下讨论:

    验证烤面包机的基本步骤包括:

  • 执行操作以触发toast消息显示在屏幕上
  • 拍摄x个屏幕截图
  • 增加所有屏幕截图的分辨率
  • 使用tessearct OCR检测toast消息
  • 请参阅使用Java OCR库(见底部):


    您可以按照以下链接上的信息在计算机上安装Tesseract:

    对于Mac:

    对于Windows:

    在计算机上安装TessEract后,需要在项目中添加TessEract Java库的依赖项。如果您使用Maven,添加以下依赖项将起作用:

        <dependency>
            <groupId>org.bytedeco.javacpp-presets</groupId>
            <artifactId>tesseract</artifactId>
            <version>3.04-1.1</version>
        </dependency>
    
    
    org.bytedeco.javacpp-presets
    特塞拉特
    3.04-1.1
    
    此外,不需要遵循Ivan提到的“步骤3”

    如果您使用的是“TestNG”,则TessEract API只需初始化一次,而不是每次都进行初始化,根据您的框架,您可以在“BeforeTest”或“BeforeSuite”或“BeforeClass”方法中对其进行初始化,并相应地在“AfterTest”或“AfterSuite”或“AfterClass”方法中关闭API

    下面是我为实现它而编写的代码

    import static org.bytedeco.javacpp.lept.pixDestroy;
    import static org.bytedeco.javacpp.lept.pixRead;
    import java.io.File;
    import java.io.IOException;
    import org.apache.commons.io.FileUtils;
    import org.bytedeco.javacpp.lept.PIX;
    import org.bytedeco.javacpp.tesseract.TessBaseAPI;
    import org.openqa.selenium.OutputType;
    import org.openqa.selenium.TakesScreenshot;
    import org.testng.annotations.AfterSuite;
    import org.testng.annotations.BeforeSuite;
    
        public class BaseTest {
        
        static TessBaseAPI api = new TessBaseAPI();
        
        @BeforeSuite
            public void beforeSuit() throws IOException {
        
                File screenshotsDirec = new File("target/screenshots");
        
                if (screenshotsDirec.exists())
                    FileUtils.forceDelete(screenshotsDirec);
        
                FileUtils.forceMkdir(screenshotsDirec);
        
                System.out.println("Initializing TessEract library");
        
                if (api.Init("/opt/local/share", "eng") != 0) {
                    System.err.println("Could not initialize tesseract.");
                }
        
            }
        
        public synchronized boolean verifyToastMessage(String msg)
                    throws IOException {
                TakesScreenshot takeScreenshot = ((TakesScreenshot) driver);
        
                File[] screenshots = new File[5];
        
                for (int i = 0; i < screenshots.length; i++) {
                    screenshots[i] = takeScreenshot.getScreenshotAs(OutputType.FILE);
                }
        
                String outText;
        
                Boolean isMsgContains = false;
        
                for (int i = 0; i < screenshots.length; i++) {
                    PIX image = pixRead(screenshots[i].getAbsolutePath());
                    api.SetImage(image);
                    outText = api.GetUTF8Text().getString().replaceAll("\\s", "");
                    System.out.println(outText);
                    isMsgContains = outText.contains(msg);
                    pixDestroy(image);
                    if (isMsgContains) {
                        break;
                    }
                }
        
                return isMsgContains;
        
            }
        
        @AfterSuite()
            public void afterTest() {
        
                try {
                    api.close();
                } catch (Exception e) {
                    api.End();
                    e.printStackTrace();
                }
        
            }
        }
    
    import static org.bytedeco.javacpp.lept.pixDestroy;
    导入静态org.bytedeco.javacpp.lept.pixRead;
    导入java.io.File;
    导入java.io.IOException;
    导入org.apache.commons.io.FileUtils;
    导入org.bytedeco.javacpp.lept.PIX;
    导入org.bytedeco.javacpp.tesseract.TessBaseAPI;
    导入org.openqa.selenium.OutputType;
    导入org.openqa.selenium.TakesScreenshot;
    导入org.testng.annotations.AfterSuite;
    导入org.testng.annotations.BeforeSuite;
    公共类基类测试{
    静态TessBaseAPI=新的TessBaseAPI();
    @套房前
    public void beforeSuit()引发IOException{
    文件截图direc=新文件(“目标/截图”);
    if(screenshotsDirec.exists())
    FileUtils.forceDelete(屏幕快照direc);
    FileUtils.forceMkdir(屏幕快照direc);
    System.out.println(“初始化TessEract库”);
    if(api.Init(“/opt/local/share”,“eng”)!=0){
    System.err.println(“无法初始化tesseract.”);
    }
    }
    公共同步布尔验证ToastMessage(字符串消息)
    抛出IOException{
    TakesScreenshot takeScreenshot=((TakesScreenshot)驱动程序);
    文件[]屏幕截图=新文件[5];
    对于(int i=0;i

    我还想补充一点,以这种方式编写测试来读取和验证Toast消息不是很可靠,因为在我的一个测试中,此代码成功捕获了Toast消息,而在另一个测试中,它无法捕获Toast消息,因为当Toast消息消失时,屏幕截图的捕获就开始了。这就是我试图高效地编写这段代码的原因。但是,这也不起作用。

    您可以按照以下链接上的信息在您的机器上安装Tesseract:

    对于Mac:

    对于Windows:

    在计算机上安装TessEract后,需要在项目中添加TessEract Java库的依赖项。如果您使用Maven,添加以下依赖项将起作用:

        <dependency>
            <groupId>org.bytedeco.javacpp-presets</groupId>
            <artifactId>tesseract</artifactId>
            <version>3.04-1.1</version>
        </dependency>
    
    
    org.bytedeco.javacpp-presets
    特塞拉特
    3.04-1.1
    
    此外,不需要遵循Ivan提到的“步骤3”

    如果您使用的是“TestNG”,则TessEract API只需初始化一次,而不是每次都进行初始化,根据您的框架,您可以在“BeforeTest”或“BeforeSuite”或“BeforeClass”方法中对其进行初始化,并相应地在“AfterTest”或“AfterSuite”或“AfterClass”方法中关闭API

    下面是我为实现它而编写的代码

    import static org.bytedeco.javacpp.lept.pixDestroy;
    import static org.bytedeco.javacpp.lept.pixRead;
    import java.io.File;
    import java.io.IOException;
    import org.apache.commons.io.FileUtils;
    import org.bytedeco.javacpp.lept.PIX;
    import org.bytedeco.javacpp.tesseract.TessBaseAPI;
    import org.openqa.selenium.OutputType;
    import org.openqa.selenium.TakesScreenshot;
    import org.testng.annotations.AfterSuite;
    import org.testng.annotations.BeforeSuite;
    
        public class BaseTest {
        
        static TessBaseAPI api = new TessBaseAPI();
        
        @BeforeSuite
            public void beforeSuit() throws IOException {
        
                File screenshotsDirec = new File("target/screenshots");
        
                if (screenshotsDirec.exists())
                    FileUtils.forceDelete(screenshotsDirec);
        
                FileUtils.forceMkdir(screenshotsDirec);
        
                System.out.println("Initializing TessEract library");
        
                if (api.Init("/opt/local/share", "eng") != 0) {
                    System.err.println("Could not initialize tesseract.");
                }
        
            }
        
        public synchronized boolean verifyToastMessage(String msg)
                    throws IOException {
                TakesScreenshot takeScreenshot = ((TakesScreenshot) driver);
        
                File[] screenshots = new File[5];
        
                for (int i = 0; i < screenshots.length; i++) {
                    screenshots[i] = takeScreenshot.getScreenshotAs(OutputType.FILE);
                }
        
                String outText;
        
                Boolean isMsgContains = false;
        
                for (int i = 0; i < screenshots.length; i++) {
                    PIX image = pixRead(screenshots[i].getAbsolutePath());
                    api.SetImage(image);
                    outText = api.GetUTF8Text().getString().replaceAll("\\s", "");
                    System.out.println(outText);
                    isMsgContains = outText.contains(msg);
                    pixDestroy(image);
                    if (isMsgContains) {
                        break;
                    }
                }
        
                return isMsgContains;
        
            }
        
        @AfterSuite()
            public void afterTest() {
        
                try {
                    api.close();
                } catch (Exception e) {
                    api.End();
                    e.printStackTrace();
                }
        
            }
        }
    
    import static org.bytedeco.javacpp.lept.pixDestroy;
    导入静态org.bytedeco.javacpp.lept.pixRead;
    导入java.io.File;
    导入java.io.IOException;
    导入org.apache.commons.io.FileUtils;
    导入org.bytedeco.javacpp.lept.PIX;
    导入org.bytede