6

我正在使用 Xcode“Instruments”工具为 iOS 应用程序构建自动化,我需要验证我在应用程序中创建的条目的标签是否正确。

出于某种原因,下面列出的代码不会导致可靠的通过或失败。相反,当它运行时,我在日志中收到“问题”警告,并且测试在没有明确关闭的情况下退出。

我想更改我的测试,以便检查我知道正在创建的标签名称,因为我可以在自动化运行后使用 AccessibilityViewer 看到它。

如果标签是正确的,那么我想将测试记录为通过。

我曾经UIATarget.localTarget().logElementTree()映射我的元素树,并在我的条目创建后使用 AccessibilityInspector 来验证我的标签的名称。麻烦的是,我似乎无法获得验证此正确性的语法。

我的辅助功能检查员已验证标签名称为:MyDogs!它具有静态文本的特征,并给出 {{114, 0},{166,480}} 的框架

通过查看元素树——我希望我可以粘贴到这里,看起来标签会沿着这条路径找到:

\Target
-+
--\Application
---+
----\Window
-----+
------\TableView
-------+
--------\TableCell: name:MyDogs! rect:{0, 40},{480,166}}
---------|UIAStaticText: name:MyDogs! value:MyDogs! rect:{{0, 40},{480, 166}}
---------|UIAButton: name:story list share rect:{{439, 41},{33, 28}}

谁能告诉我如何验证这个标签?

我当前的代码看起来像这样(但没有检查标签——因为我不知道如何):

var testName = "LoginCreateEntry";

//Start test logging
UIALogger.logStart(testName);

//This is supposed to target the entry that my automation has created.
//The flow goes, run the automation that creates the entry, then verify that the entry
//got created as expected and is visible to the user in the iPhone interface.

    var myEntry = target.frontMostApp().mainWindow().scrollViews().staticTexts()["My Dogs!"].value(); 

    var entryName = "My Dogs!";

//Do a bunch of UI automation here to create my entry, which results in the entry
//appearing in the mainWindow with the label: My Dogs!

//If myEntry evaluates to true, then call this test a pass.

if (myEntry === entryName) {    
UIALogger.logMessage("My entry was created!");

    //Mark the test as a PASS
    UIALogger.logPass(testName);
}
else {

    UIALogger.logMessage("My entry was not created!");

    //Mark the test as a FAIL
    UIALogger.logFail(testName); 
    }

//End test

任何反馈或帮助将不胜感激!!

- - - - - - - - - - - - - - - - -更新 - - - - - - - - ----------------------
谢谢大家的帮助!我实际上得到了标题的值,并将在下面显示我的解决方案。但无论我做什么,我都无法让通过/失败日志记录功能正常工作——其他人也遇到过这个问题。我一直在愤怒

Issue: Script ended without explicting closing this test

我的测试结束时的消息。我越来越相信这是 Instruments 的错误。

这是我更新的测试:

var target = UIATarget.localTarget();
var app = UIATarget.localTarget().frontMostApp();

var testName = "LoginCreateEntry";

//Start test logging
UIALogger.logStart( testName );

//Do lots of gui automation stuff here to create the entry which will appear in my app interface.
//I want to verify that the title I gave the entry matches what appears in the app interface

var window = app.mainWindow();
var tableView = window.tableViews()[0];
var tableGroup = tableView.groups()[0];
var entryName = "My Dogs!";

var myEntry = tableView.cells()[0].name(); //<-- This is what I needed!!!

UIALogger.logMessage("My Story Title: " + myEntry); //Print out entry name in log

if (myEntry === entryName) {    

    UIALogger.logMessage("My entry was created!");

    //Mark the test as a PASS
    UIALogger.logPass (testName);

} else {

    UIALogger.logMessage("My entry was not created!");

    //Mark the test as a FAIL
    UIALogger.loFails (testName); 

    }
//End test 
4

2 回答 2

5

我建议使用tuneup_js。使用该库,您可以轻松创建测试用例并检查标签是否存在并且等于My Dogs

你可以像这样使用它

test("LoginCreateEntry", function(target,app){
    //Create Entry
    //....
    var myEntry = target.frontMostApp().mainWindow().scrollViews().staticTexts()["My Dogs!"].name();

    //Check is Label is equal to My Dogs
    //Test "LoginCreateEntry" will fail if myEntry is not equal to My Dogs
    assertEquals(myEntry, "My Dogs");
});

PS你应该使用.name()而不是.value()获取标签的名称

于 2013-03-06T06:41:00.663 回答
5

至少在 2012 年夏天和 iOS 5 中,我发现我无法通过accessibilityLabel 访问UIA 元素,除非还设置了accessibilityIdentifier。

不幸的是,截至当时(以及从 Xcode 4.2 开始),accessibilityIdentifier 只能在代码中设置,而不能在 Interface Builder 中设置。不知道从那以后情况是否有所改善。有关更多信息,请参阅此 SO 问题:

我可以在界面生成器中设置可访问性标识符吗?Xcode4.2

但正如我所提到的,如果您可以访问应用程序的源代码,则可以通过自动化标识符获得 UIA 访问权限。(或者可以影响有权访问的人,我想!)

我在 github 上有一个项目,它展示了如何在 UILabel 上(在应用程序源中)设置accessibilityIdentifier,然后编写一个 UIA 测试,以您的代码似乎试图做的方式成功访问该元素。

首先是我的测试文件,我尝试在其中找到显示字符串“!”的 UILabel:

https://github.com/billagee/UnicodeTapper-iphone4.2/blob/master/UnicodeTapperTests/tests.js

    // for iOS 5 - note 4 must be handled differently
    var charDisplayed = window.staticTexts()["bigCharLabel"].value();
    if (charDisplayed == "!") {
        UIALogger.logPass("Exclamation point displayed at startup");
    } else {
        UIALogger.logFail("Incorrect character displayed: " + charDisplayed);
    }

然后,在目标应用程序的源代码中,设置 UILabel 的可访问性属性如下所示:

// If device supports it, set accessibility identifiers for the UILabels
// in order to find them in UIAutomation easily.  Note that the
// accessibilityIdentifier can't be set in IB yet, as of Xcode 4.3.3;
// also, it's only supported in iOS 5 and up.
topBarLabel.isAccessibilityElement = YES;
bigCharLabel.isAccessibilityElement = YES;
if ([topBarLabel respondsToSelector:@selector(accessibilityIdentifier)]) {
    topBarLabel.accessibilityIdentifier = @"topBarLabel";
    bigCharLabel.accessibilityIdentifier = @"bigCharLabel";
} else {
    topBarLabel.accessibilityLabel = @"topBarLabel";
    bigCharLabel.accessibilityLabel = @"bigCharLabel";        
}

完整来源在这里:

https://github.com/billagee/UnicodeTapper-iphone4.2/blob/master/UnicodeTapper/UnicodeTapperViewController.m

于 2013-03-06T06:55:28.453 回答