经过多次自动化努力后无法找到 android 本机应用程序的验证

Posted

技术标签:

【中文标题】经过多次自动化努力后无法找到 android 本机应用程序的验证【英文标题】:Unable to locate validation of android native app after many efforts in automation 【发布时间】:2018-02-09 14:47:48 【问题描述】:

我正在对 android 原生应用进行自动化操作,并希望使用文本验证登录验证。当我尝试使用 Appium 检查器和 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) 

输出:

异常: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.");

【问题讨论】:

如果您正在寻找文本,它可能是一条祝酒词:developer.android.com/guide/topics/ui/notifiers/toasts.html。 Appium 有支持 Toast 消息的已知问题,请参阅此主题以获得关于此的大讨论:discuss.appium.io/t/verifying-toast/3676/16 您是否在显示此弹出窗口时尝试切换上下文以判断 UI automator/chrome 检查是否以某种方式检测到它? @nullpointer - 是的,也试过了。 这两种方式中的内容是否仍然不可见? @nullpointer - 不,实际上它返回给我的子窗口/弹出窗口大小为零。 【参考方案1】:

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

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

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

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

【讨论】:

谢谢@Vinod - 你节省了我的时间。我已经花了很多时间来解决这个问题,但现在我不会浪费时间了 :)【参考方案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"

【讨论】:

即使我这样做了 driver.getpagesource(),我也没有得到那个特定的文本。我仍然会尝试你的答案并更新你。 这不起作用。获取异常:org.openqa.selenium.NoSuchElementException: 是否有可能是“电话号码无效”。显示为图像? 如果您无法访问该元素,您将截取屏幕截图(您可以将其裁剪为您想要的区域)并使用掩码比较它以检查您是否收到错误消息与否...例如:OpenCV 没有。实际上使用android代码显示:contactnu.setError("Invalid phone number.");

以上是关于经过多次自动化努力后无法找到 android 本机应用程序的验证的主要内容,如果未能解决你的问题,请参考以下文章

无法找到在 Appium android 中动态生成的元素

HTML5 音频未在 Android 4.0.4 设备本机浏览器中多次播放

经过多次执行后,CUDA程序的结果不一致

从 android/ios 使用 Symfony 进行身份验证

我在哪里可以找到android本机闹钟应用程序的时间选择器视图?

Java Sound Clip 在多次播放后无法播放