经过多次自动化努力后无法找到 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 本机应用程序的验证的主要内容,如果未能解决你的问题,请参考以下文章
HTML5 音频未在 Android 4.0.4 设备本机浏览器中多次播放
从 android/ios 使用 Symfony 进行身份验证