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