如何在Appium中测试Android Toast消息(selenium Java)

时间:2015-05-26 12:43:07

标签: selenium-webdriver appium android-testing selendroid

我正在使用Selenium和Java在Android上运行脚本(通过Appium服务器)。 我发现使用selenium&#39>找不到烤面包是不可能的

driver.findElement(By.LinkText("User not logged in")

在Appium中

但可以在Selendroid中用于捕获Toast消息。

我有一种方法可以在同一个脚本中同时使用Selendroid和Appium吗?

8 个答案:

答案 0 :(得分:1)

方法1:(来自Appium 1.6.4版)支持Toast消息,因为您需要使用automationName:'uiautomator2'

toast = driver.find_element(:xpath, "//android.widget.Toast[1]")
if toast.text == "Hello" 

但是我不建议这样做,因为uiautomator2还不稳定。

方法2:

  1. 在屏幕上触发短信
  2. 捕获屏幕截图
  3. 将图像转换为文本文件

    def assettoast(string)
      sname = (0...8).map { (65 + rand(26)).chr }.join
      $driver.driver.save_screenshot("#{sname}")
    
      # Make sure tesseract is installed in the system. If not you can install using "brew install tesseract" in mac
      system ("tesseract #{sname} #{sname}")
    
      text_file="#{sname}.txt"
      var= get_string_from_file(string, text_file)
      raise if var != true
    end
    
  4. 检查文本文件中是否有吐司消息

    def get_string_from_file(word, filename)
      File.readlines(filename).each do |line|
      return true if line.include?(word)
      end
    end
    

答案 1 :(得分:1)

最后,我们无需阅读屏幕截图和执行OCR即可阅读敬酒信息。 我已经在Appium 1.15.1上进行了测试。

Toast消息位于com.package.system下。

通常,用于此的Xpath将是“ /hierarchy/android.widget.Toast”。 并且,类名将为“ android.widget.settings”

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

WebDriverWait waitForToast = new WebDriverWait(driver.25);

waitForToast.until(ExpectedConditions.presenceOfElementLoacted(By.xpath("/hierarchy/android.widget.Toast")));

String toastMessage = driver.findElement((By.xpath("/hierarchy/android.widget.Toast")).getText();

System.out.println(toastMessage);

答案 2 :(得分:0)

看起来您无法在同一会话中切换驱动程序类型。 如果您尝试仅切换到Selendroid进行吐司验证 - 您可以使用OSR图像识别引擎。

检查此答案w/ Ruby bindings

想法非常简单:

  • 制作吐司留言
  • 截取几张截图
  • 迭代截图并查找所需文字

以下是Java中OCR使用的简单示例:tess4j example(确保安装了Tesseract引擎)

答案 3 :(得分:0)

public void getTicketTotal(){
      SQLiteDatabase db=this.getWritableDatabase();
      db.rawQuery("update ticket_table tt set total= tt.quantity * tt.item_price" ,null);
    }

答案 4 :(得分:0)

Appium 1.6.4@beta最新版本支持Toast消息

答案 5 :(得分:0)

截取Toast Message页面的屏幕截图,尝试将图像文件转换为Text并使用以下代码验证文本。

  public void imageconversion(String filePath) throws IOException,          
    {    
                ITesseract instance = new Tesseract();
    //file path is the image which you need to convert to text
                File imageFile = new File(filePath);  
                BufferedImage img = null;
                img = ImageIO.read(imageFile);
                BufferedImage blackNWhite = new BufferedImage(img.getWidth(),img.getHeight(), BufferedImage.TYPE_BYTE_BINARY);
                Graphics2D graphics = blackNWhite.createGraphics();
                graphics.drawImage(img, 0, 0, null);
                //path where your downloaded tessdata exists
                instance.setDatapath("E://ocr//data"); 
              //What language you required to convert,( e.g. English)
                instance.setLanguage("eng");        
                String result = instance.doOCR(blackNWhite);


                System.out.println(result);

            }

答案 6 :(得分:0)

Appium直接不提供任何API来读取我们需要使用tess4j jar执行此操作的toast消息。首先我们需要拍摄屏幕截图,然后我们需要使用tess4j API从屏幕截图中读取文本。

 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;
 }

有关详细信息,请参阅此视频 - https://www.youtube.com/watch?v=lM6-ZFXiSls

答案 7 :(得分:0)

我发现了三种捕获Toast消息并进行验证的方法。

  1. 要获取页面来源并从中验证吐司消息。

public void verifyToastMessageUsingPageSource(String toastmsg) throws InterruptedException { boolean found = false; for(int i =0 ; i <8; i++){ if(getDriver().getPageSource().contains("class=\"android.widget.Toast\" text=\""+toastmsg+"\"")){ found = true; break; } Thread.sleep(300); } Assert.assertTrue(found,"toast message "+toastmsg+" is present"); }

相似之处可以使用Xpath: //android.widget.Toast[1]

  1. 使用grep命令,在uiautomator事件中等待吐司消息。 在单击之前运行命令,toast消息将被更改。

    adb shell uiautomator事件| grep“ ToastMessgae”

  2. 这很棘手,需要更多代码才能运行。

    • 开始捕获屏幕截图线程。
    • 执行点击操作
    • 停止屏幕捕获线程。
    • 使用OCR从捕获的图像中提取文本,并验证捕获的图像中是否包含烤面包消息。

我更喜欢1st和2nd选项,它以更少的时间和更少的代码提供了验证。

如果需要第二点和第三点的代码,请注释。