iOS UI 自动化:处理两个 alertView,其中一个触发另一个

Posted

技术标签:

【中文标题】iOS UI 自动化:处理两个 alertView,其中一个触发另一个【英文标题】:iOS UI automation: Handling two alertViews, where one triggers another 【发布时间】:2013-06-17 22:17:40 【问题描述】:

这就是我想要做的。

1) 我有一个 alertView 询问“你在哪里购物?”。此警报有两个按钮跳过/取消和继续。 2)通过单击跳过按钮,它会弹出另一个标题为“附近列表:”的警报视图,并显示附近商店的 tableView 列表,用户可以从中选择任何商店。这个只有一个取消按钮。 (取消按钮关闭警报并返回主页)

我的问题是每当我试图绕过默认处理程序时

    UIATarget.onAlert = function onAlert(alert) 
        var title = alert.name();
        UIALogger.logWarning("Alert with title ’" + title + "’ encountered!");
        if (title == "Where are you shopping?") 
            alert.buttons()["Skip"].tap();
            return true; // bypass default handler
        
        return false; 
        

这会点击跳过按钮,然后弹出第二个警报,并且在第二个警报上点击默认按钮,即使我没有为此编写任何代码。

我想点击第一个警报的跳过按钮,然后点击第二个警报的一个单元格。所以我尝试了下面的代码,但它仍然会在不点击单元格的情况下关闭第二个警报。不知道该怎么做。我是初学者,所以非常感谢任何帮助。

    var target = UIATarget.localTarget();
    var app = target.frontMostApp();
    var window = app.mainWindow();
    var testName = "Test 1";

    UIALogger.logStart(testName);


    var buttonScan = target.frontMostApp().windows()[0].buttons()["scan btn"];
    //UIATarget.localTarget().pushTimeout(1);

    target.delay(1);

    //app.logElementTree();

    if (buttonScan.isValid()) 
  buttonScan.tap();

  // first alert box "Where are you shopping"
  UIATarget.onAlert = function onAlert(alert)  // this is never called
      var title = alert.name();
      UIALogger.logWarning("Alert with title ’" + title + "’ encountered!");
      if (title == "Where are you shopping?") 
          alert.buttons()["Skip"].tap();
      return true; // bypass default handler
      
  return false; 


// second alert box "Nearby listings:"
UIATarget.onAlert = function onAlert(alert) 
    var title = alert.name();
UIALogger.logMessage( "Dismiss the keyboard" + title );
    UIALogger.logWarning("Alert2 with title ’" + title + "’ encountered!");
    if (title == "Nearby listings:") 

        return true; // bypass default handler
    
    return false; // use default handler that is dismissing the alert
   


      UIALogger.logPass(testName);


    else 

        UIALogger.logFail(testName);

    

【问题讨论】:

您是否确认您的onAlert 处理程序正在被调用?引用 Apple 文档,如果未指定警报,或者处理程序返回 false,它会尝试单击 cancel。在您的情况下,如果条件语句为真或假,您将单击取消。因此,请确保您实际上可以单击第一个警报上的 Continue 按钮。 @ekims 感谢您的回复。对我来说,预期的行为是,当我单击跳过(这是第一个警报的取消按钮)时,第二个警报应该在其中显示一个 tableView。现在在第二个警报中,我想选择一个单元格(产品列表),它将带我到另一个屏幕。 我只是建议您尝试单击第一个警报上的Continue 按钮,以确保您的警报处理程序在第一个场景中工作。因为如果没有指定警报处理程序,它默认为取消按钮。这将帮助我们缩小可能出现问题的范围。 @ekim 你是对的。谢谢你的建议。现在我知道它也不适用于第一个警报。你能告诉我第一个有什么问题吗? 无论点击哪个按钮(跳过或继续),都会出现第二个警报。我发现第一个警报在跟踪日志中不起作用,因为它没有显示 logWarning 消息。救命!!! 【参考方案1】:

在获取UITarget 的实例之前尝试设置onAlert 处理程序。

例如:

// first alert box "Where are you shopping"
UIATarget.onAlert = function onAlert(alert)  // this is never called
      var title = alert.name();
      UIALogger.logWarning("Alert with title ’" + title + "’ encountered!");
      if (title == "Where are you shopping?") 
          alert.buttons()["Skip"].tap();
          return true; // bypass default handler
      
  return false; 

    var target = UIATarget.localTarget();
    var app = target.frontMostApp();
    var window = app.mainWindow();
    var testName = "Test 1";

    UIALogger.logStart(testName);

    var buttonScan = target.frontMostApp().windows()[0].buttons()["scan btn"];
    //UIATarget.localTarget().pushTimeout(1);

    target.delay(1);
    //app.logElementTree();

    if (buttonScan.isValid()) 
  buttonScan.tap();

   //alert should happen here

【讨论】:

嘿,它现在工作了(通过将 onAlert 移到顶部)。我在最后一次尝试中错过了一个报价。非常感谢这个人。你为我节省了更多时间的痛苦。对于我的下一个 UIAutomation 项目,我肯定希望与您联系。 没问题。我已经在一些工作项目中使用过它,并且很高兴在可能的情况下提供帮助。

以上是关于iOS UI 自动化:处理两个 alertView,其中一个触发另一个的主要内容,如果未能解决你的问题,请参考以下文章

按钮上的 iOS alertview 操作

在 iOS 8.1 之后,在所有设备上,当点击 alertview 取消按钮时,ScrollView 向上并且不滚动

iOS 8 中的 AlertView 问题

在 UIAlertAction 处理程序中更新 UI

在 ios 9 中快速使用 alertview

iOS 弹窗alertView使用详解