Java 经过多次自动化工作后,无法找到android本机应用程序的验证

Java 经过多次自动化工作后,无法找到android本机应用程序的验证,java,android,validation,selenium-webdriver,appium,Java,Android,Validation,Selenium Webdriver,Appium,我正在做Android本机应用程序的自动化,希望用文本验证登录验证。当我尝试使用Appium inspector和Uiautomator拾取它时。两者都无法定位验证部分,所以很难选择它 我尝试了来自不同论坛和Appium讨论的代码,但仍然无法通过自动化找到验证。我尝试了以下方法: 代码1 JavascriptExecutor js = (JavascriptExecutor)driver; WebElement field = driver.findElement(By.xpath("//a

我正在做Android本机应用程序的自动化,希望用文本验证登录验证。当我尝试使用Appium inspector和Uiautomator拾取它时。两者都无法定位验证部分,所以很难选择它

我尝试了来自不同论坛和Appium讨论的代码,但仍然无法通过自动化找到验证。我尝试了以下方法:

代码1

JavascriptExecutor js = (JavascriptExecutor)driver;

WebElement field = driver.findElement(By.xpath("//android.widget.EditText[@text='Enter mobile number']"));
// Boolean is_valid = (Boolean)js.executeScript("return arguments[0].checkValidity();", field);

try {
    String message = (String) js.executeScript("return arguments[0].validationMessage;", field);
} catch (Exception E) {
输出:

JavascriptExecutor js = (JavascriptExecutor)driver;

WebElement field = driver.findElement(By.xpath("//android.widget.EditText[@text='Enter mobile number']"));
// Boolean is_valid = (Boolean)js.executeScript("return arguments[0].checkValidity();", field);

try {
    String message = (String) js.executeScript("return arguments[0].validationMessage;", field);
} catch (Exception E) {
异常:org.openqa.selenium.WebDriverException:方法尚未启动 已实施

代码2

public boolean IsValidationFired() {
    if(driver.getPageSource().contains("Invalid")) {
        System.out.println("PASS");
    } else {
        System.out.println("FAIL");
    }
}
输出:

打印=失败

我不确定它是javascript弹出窗口还是本机应用弹出窗口或toast消息。但我希望通过自动化来检查和验证它

更新

JavascriptExecutor js = (JavascriptExecutor)driver;

WebElement field = driver.findElement(By.xpath("//android.widget.EditText[@text='Enter mobile number']"));
// Boolean is_valid = (Boolean)js.executeScript("return arguments[0].checkValidity();", field);

try {
    String message = (String) js.executeScript("return arguments[0].validationMessage;", field);
} catch (Exception E) {

用于触发验证的代码是:contactnu.setError(“无效电话号码”)

为什么不尝试使用正则表达式进行搜索,例如:

public boolean IsValidationFired()
{           
       try{
           WebElement invalid = driver.findElement(By.xpath("//*[@text='Invalid phone number.']"));
           //You could check if @text contains just invalid Invalid
           //WebElement invalid = driver.findElement(By.xpath("//*[contains(@text, 'Invalid')]]"));
           if(invalid != null)
           {
               System.out.println("PASS");
           }
           else
           {
               System.out.println("FAIL");
           }
       }catch(NoSuchElementException ex){
           System.out.println("Element not found");
       }
}
无论如何,这不是一个很好的解决方案(*在xpath中)。。。用它来测试一下。搜索会很慢。。。如果您找到了元素,您将不得不制作一个更好的XPATH解决方案

注意:找到元素后,要确定是否是TextView、Toast、。。。我建议这样做:

System.out.println(invalid.getAttribute("className"));
//This will print something like: "android.widget.TextView"

在过去的两年里,我一直在做Android应用程序自动化测试。我曾多次遇到过同样的问题。不幸的是,uiAutomator没有检测到这类元素,因此我们无法对这些元素执行任何操作

Appium在内部向uiAutomator发送命令,uiAutomatar在设备上执行操作。如果uiAutomator看到这些元素,则uiAutomator可以执行操作

所以我建议您不要在使用java脚本或xPath上花费太多时间,因为我已经尝试过这些解决方案,但它们都不起作用


然而,有一种解决办法非常冗长。您可以从设备上获取此屏幕的屏幕截图,并在运行时将其存储到您的计算机中,然后使用SIKULI检查图像中是否有文本“无效电话号码”。或者,您可以要求开发人员将错误消息更改为uiAutomator中的某个可见组件。希望这对您有所帮助。

如果您正在查找文本,可能是祝酒词:。Appium已经知道支持Toast消息的问题,请参阅此线程,了解有关此问题的详细讨论:在显示此弹出窗口时,您是否尝试切换上下文,以确定UI automator/chrome inspect是否以某种方式检测到它?@nullpointer-是的,也尝试过。内容是否仍然以任何方式不可见?@nullpointer-否,实际上,它返回的子窗口/弹出窗口大小为零。即使我使用driver.getpagesource(),我也不会得到那个特定的文本。但我还是会尝试你的答案,并更新你。这是行不通的。获取异常:org.openqa.selenium.NoSuchElementException:是否可能“无效电话号码”显示为图像?如果您无法访问该元素,您将需要截图(您可以将其裁剪为您想要的区域)并使用掩码进行比较,以检查是否收到错误消息。。。例如:OpenCVNo。实际上,该显示使用android代码:contactnu.setError(“无效电话号码”);谢谢你@Vinod-你节省了我的时间。我已经花了很多时间来解决这个问题,但现在我不会浪费时间:)