我正在使用Selenium和Java在Android上运行脚本(通过Appium服务器)。 我发现使用selenium&#39>找不到烤面包是不可能的
driver.findElement(By.LinkText("User not logged in")
在Appium中
但可以在Selendroid中用于捕获Toast消息。
我有一种方法可以在同一个脚本中同时使用Selendroid和Appium吗?
答案 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:
将图像转换为文本文件
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
检查文本文件中是否有吐司消息
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消息并进行验证的方法。
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]
使用grep命令,在uiautomator事件中等待吐司消息。 在单击之前运行命令,toast消息将被更改。
adb shell uiautomator事件| grep“ ToastMessgae”
这很棘手,需要更多代码才能运行。
我更喜欢1st和2nd选项,它以更少的时间和更少的代码提供了验证。
如果需要第二点和第三点的代码,请注释。