在自动化方面付出了许多努力后,无法找到Android原生应用程序的验证

我正在执行Android本机应用程序的自动化,并希望用文本验证登录验证。当我尝试使用Appium检查器和Uiautomator来选择它时。两者都无法找到验证部分,因此很难选择它。

enter image description here

我尝试了来自不同论坛和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) {

输出:

异常 : org.openqa.selenium.WebDriverException: 方法尚未实现

代码 2

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

输出:

打印 = 失败

我不确定它是javascript弹出窗口还是本机应用程序弹出窗口或Toast消息。但希望通过自动化对其进行检查和验证。

更新

用于触发验证的代码是:contactnu.setError("Invalid phone number.");


答案 1

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

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

所以我建议你不要花太多时间使用java脚本或xPath,因为我已经尝试过软管解决方案,但它们都没有用。

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


答案 2

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

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"

推荐