我使用iOS UI Automation framework确保my iPhone app岩石。
使用这个框架的每个人都会告诉你它很棒,但它缺乏很多结构。
所以我必须处理UIAWindow的实例,这些实例代表我应用的不同屏幕。为了更加面向对象,我想为每个屏幕设置一个特定的类,所以我可以添加特定的方法,比如
myScreen1.tapDoneButton();
var total = myScreen2.getNumberOfElements();
目前,我可以通过将UIAWindow的实例传递给将添加适当方法的函数来实现这一目标,如下所示:
function makeMainScreen(actualScreen)
{
actualScreen.constructor.prototype.getAddButton = function() {
return this.buttons()["add button"];
};
actualScreen.constructor.prototype.tapAddButton = function() {
this.getAddButton().tap();
};
// Add any desired method...
return actualScreen;
}
它工作正常,我这样使用它:
var mainScreen = makeMainScreen(app.mainWindow());
mainScreen.tapAddButton();
但这似乎不够面向对象,我想使用 new 和 this 关键字创建真实对象,所以我要声明像这样:
function MainScreen(actualScreen){
// This line doesn't work : because 'this' is immutable
this = actualScreen;
this.tapAddButton = function(){
this.getAddButton().tap();
}
//...
}
我会像这样使用它:
var mainScreen = new MainScreen(app.mainWindow());
mainScreen.tapAddButton();
我以为我可以将actualScreen保存为对象的属性(如下面的Grace Shao的回答),并调用其上的所有方法,但我想保留原始的UIAWindow方法。
有人知道怎么做吗? 或者也许我想要实现的目标没有意义,在这种情况下我会很高兴知道。
答案 0 :(得分:1)
如果我理解正确,您可以尝试以下方法:
function MainScreen(actualScreen){
this.screen = actualScreen;
}
MainScreen.prototype.tapAddButton = function () {
this.screen.getAddButton().tap();
};
MainScreen.prototype.getScreen = function () {
return this.screen;
};
//...
var mainScreen = new MainScreen(app.mainWindow());
mainScreen.tapAddButton();
您无法为this
分配任何内容。您还可以在构造函数MainScreen
中定义方法,但它们将被视为特权成员。
function MainScreen(actualScreen){
this.screen = actualScreen;
this.tapAddButton = function () {
this.screen.getAddButton().tap();
};
}
如果您不希望它们成为特权成员,最好在构造函数外部定义它们。否则,每次实例化新对象时,都会一次又一次地初始化成员。
<强>更新强>:
你也可以在构造函数中使用screen
的方法包装器,如下所示。
var prop;
for (prop in actualScreen) {
if (typeof actualScreen[prop] !== 'Function') {
continue;
}
this[prop] = function () {
return actualScreen[prop].apply(actualScreen, arguments);
};
}