首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Xcode 7 UI测试的页面对象模式

Xcode 7 UI测试的页面对象模式
EN

Stack Overflow用户
提问于 2016-05-02 18:09:47
回答 2查看 1.4K关注 0票数 1

是否有人在他们的UI测试中成功地实现了Page对象模式?我试了一试,遇到了一个问题。当我使用谓词等待元素存在时,我会在日志中得到一个警告。下面是Page对象类的代码片段:

代码语言:javascript
复制
XCUIElement *myCoolButton = self.app.buttons[@"Super Cool Button"];
[self expectationForPredicate:self.existsPredicate evaluatedWithObject:myCoolButton handler:nil];
[self waitForExpectationsWithTimeout:5.0f handler:nil];

当执行此代码时,我在日志中看到以下内容:

代码语言:javascript
复制
Questionable API usage: creating XCTestExpectation for test case -[MyPageObject (null)] which is not the currently running test case -[MyTestCase test]

当超时超过时,我在日志中看到了错误,但是测试本身并没有真正失败。我假设这是因为谓词是在Page对象类中设置的,而不是测试本身。有人能解决这个问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-02 19:32:42

从这个问题出发,我假设waitForExpection是在Page类中编写的。

通常,页面对象不是从XCTestCase继承的,因为它们只用于保存所有UI元素的引用--可能在page.Hence中--它们不能具有断言操作(本例中为waitForExpectation)

如果您正在尝试编写一个可重用的函数,该函数可以在waitForExpectation类中包含类似于PageObject的断言,那么您需要将测试用例作为参数传递给该函数(您的函数应该接受测试用例)。

在这种情况下,我建议您在XCTestCase上使用XCUIElement作为输入参数编写一个类别(扩展名为objects ),waitsForTheElementToExist可以避免在所有页面对象中复制相同的代码,而不是在页面对象class.You中编写。

这里的示例代码

代码语言:javascript
复制
class LoginPageObect {
 let userNameTextField  = XCUIApplication().textFields["UserName"]
 let passwordTextField = XCUIApplication().textFields["Password"]

  func loginUser(testcase: XCTestCase) {
    testcase.waitForElementToAppear(userNameTextField)
    testcase.waitForElementToAppear(passwordTextField)
     //Do rest of things here
   }
 }
extension XCTestCase {
  func waitForElementToAppear(element: XCUIElement) {
    let existsPredicate = NSPredicate(format: "exists == true")
    expectationForPredicate(existsPredicate,
                            evaluatedWithObject: element, handler: nil)
    waitForExpectationsWithTimeout(5, handler: nil)
  }
}
票数 1
EN

Stack Overflow用户

发布于 2017-11-15 15:48:57

我使用了按参数传递testCase的相同想法,但后来变得非常难看。PageObjects的其中一种方法(我之前介绍的)是,您不应该在页面上声明。

所以我想出了一个实现:

代码语言:javascript
复制
class Page {
    required init(_ c: ((Bool) -> Void)? = nil) {
        c?(waitForExistence())
    }
    func waitForExistence() -> Bool {
        fatalError("Subclass of Page should override \(#function)")
    }
}

然后,您可以使用新的waitForExpectation API用于XCUIElement:waitForExistence(timeout:) (如果需要更复杂的期望,也可以使用XCTWaiter ),而不是使用需要XCTestCase的XCode9 API。

代码语言:javascript
复制
class LoginPage: Page {
    override func waitForExistence() -> Bool {
        return XCUIApplication().otherElements["view_login"].waitForExistence(timeout: 10)
    }

其用途是:

代码语言:javascript
复制
LoginPage { 
   XCTAssertTrue($0, "Login page not shown") 
}
.type(email: "solid@snake.com")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36988850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档