2017年12月16日,星期六

如何使用Appium测试Toast消息?

我们不能直接使用Appium Client API测试Toast消息。因此,这里我们将在项目中导入Tess4j jar及其API,以从屏幕截图中读取Toast消息。一旦我们在屏幕上看到了文本,我们就可以通过各种断言来验证Appium测试用例中的Toast消息文本。

有关更多详细信息,请参阅此视频-


让我们看一下获取屏幕截图的代码,然后从屏幕截图中读取文本。



package com.appium.xample;



import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import net.sourceforge.tess4j.util.LoadLibs;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;

import io.appium.java_client.android.AndroidDriver;

public class ReadToastMessage {
 
  static String scrShotDir = "screenshots";
  File scrFile;
  static File scrShotDirPath = new java.io.File("./"+ scrShotDir+ "//");
  String destFile;
  static AndroidDriver driver = null;
 
 public String readToastMessage() throws TesseractException {
  String imgName = takeScreenShot();
  String result = null;
  File imageFile = new File(scrShotDirPath, imgName);
  System.out.println("Image name is :" + imageFile.toString());
  ITesseract instance = new Tesseract();

  File tessDataFolder = LoadLibs.extractTessResources("tessdata"); // Extracts
                   // Tessdata
                   // folder
                   // from
                   // referenced
                   // tess4j
                   // jar
                   // for
                   // language
                   // support
  instance.setDatapath(tessDataFolder.getAbsolutePath()); // sets tessData
                // path

  result = instance.doOCR(imageFile);
  System.out.println(result);
  return result;
 }

 /**
  * Takes screenshot of active screen
  * 
  * @return ImageFileName
  */
 public String takeScreenShot() {
  File scrFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE); 
  
  SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy__hh_mm_ssaa");
  new File(scrShotDir).mkdirs(); // Create folder under project with name
          // "screenshots" if doesn't exist
  destFile = dateFormat.format(new Date()) + ".png"; // Set file name
               // using current
               // date time.
  try {
   FileUtils.copyFile(scrFile, new File(scrShotDir + "/" + destFile)); // Copy
                    // paste
                    // file
                    // at
                    // destination
                    // folder
                    // location
  } catch (IOException e) {
   System.out.println("Image not transfered to screenshot folder");
   e.printStackTrace();
  }
  return destFile;
 }
}

12条评论:

  1. 你好
    我尝试了上面的代码,首先我得到了不满意的链接错误,得到了解决方案,但是现在我得到错误了,

    打开数据文件/opt/local/share/tessdata/eng.traineddata时出错
    请确保将TESSDATA_PREFIX环境变量设置为您的父目录"tessdata" directory.
    加载语言失败'eng'
    Tesseract不能'加载任何语言!


    如果您在youtube视频中使用此示例运行任何示例并提出我所遇到的后续问题的解决方案,那么效果会更好。

    谢谢,
    普兰尼

    回复删除
  2. 感谢您提供有用的视频和代码显示!

    回复删除
  3. 很棒的例子。很有帮助...

    谢谢..

    回复删除
  4. 最后,我们无需阅读屏幕截图即可阅读敬酒信息。
    我已经在appium 1.15.1上进行了测试。

    吐司消息位于com.package.system下
    通常情况下,Xpath将是"/hierarchy/android.widget.Toast".
    并且,类名将为"android.widget.settings"

    您可以通过在显示吐司消息时刷新元素检查器屏幕来确认这一点。

    码:
    WebDriverWait waitForToast =新的WebDriverWait(driver.25);
    wait.until(ExpectedConditions.presenceOfElementLoacted(By.xpath("/hierarchy/android.widget.Toast")));
    字符串toastMessage = driver.findElement((By.xpath("/hierarchy/android.widget.Toast")).getText();
    System.out.println(toastMessage);

    回复删除
  5. 此评论已被作者删除。

    回复删除
  6. 非常感谢你!这个对我有用

    回复删除