ios XCUIElement抽头()不工作

flvtvl50  于 2023-05-02  发布在  iOS
关注(0)|答案(6)|浏览(220)

我有一个非常简单的XCTestCase实现,它测试点击一个按钮并期望显示一个Alert控制器。问题是tap()方法不起作用。在关联按钮的IBAction中放置一个断点,我意识到逻辑甚至没有被调用。

class uitestsampleUITests: XCTestCase {

    var app: XCUIApplication!

    override func setUp() {
        super.setUp()
        continueAfterFailure = false
        app = XCUIApplication()
        app.launch()
    }

    func testButton() {
        let button = app.buttons["Button"]
        button.tap()

        expectationForPredicate(NSPredicate(format: "exists == 1"), evaluatedWithObject: button, handler: nil)
        waitForExpectationsWithTimeout(5.0, handler: nil)
    }
}

另外,复制button.tap()指令会使测试通过,如下所示:

func testButton() {
        let button = app.buttons["Button"]
        button.tap()
        button.tap()

        expectationForPredicate(NSPredicate(format: "exists == 1"), evaluatedWithObject: button, handler: nil)
        waitForExpectationsWithTimeout(5.0, handler: nil)    
    }

我在Xcode 7中遇到了这个问题。3.1我错过了什么?是虫子吗?

xpcnnkqh

xpcnnkqh1#

一位苹果工程师对我的bug报告说:
第二种可能性是,您遇到了一个问题,有时会发生在应用程序完成启动,但启动屏幕没有立即消失,并且没有正确处理调度到应用程序的事件。
为了解决这个问题,可以考虑在测试开始时设置一个小的延迟(sleep(1)就足够了)。
所以我做了,现在它工作了:

override func setUp() {
    super.setUp()
    continueAfterFailure = false
    app = XCUIApplication()
    app.launch()
    sleep(1)
}
i34xakig

i34xakig2#

对于可命中的UIWebView,直到我通过坐标完成后,才开始工作:

extension XCUIElement {
    func forceTap() {
        coordinate(withNormalizedOffset: CGVector(dx:0.5, dy:0.5)).tap()
    }
}

希望能帮到人
也适用于不可命中的项目,如标签等。

jm81lzqq

jm81lzqq3#

我也有过类似的经历。对我来说,问题是我试图点击的元素有时出于某种原因不是hittable
从Apple的文档中:
将点击事件发送到为元素计算的可命中点。
因此,如果一个元素不是hittable,则tap动作不会做太多的事情,这会破坏测试用例的逻辑。
为了解决这个问题,在我点击某个元素之前,我会等到合适的元素变得可以点击。很简单。

#import <XCTest/XCTest.h>

@interface XCUIElement (Tap)

- (void)tapInTestCase:(XCTestCase *)testCase;

@end

@implementation XCUIElement (Tap)

- (void)tapInTestCase:(XCTestCase *)testCase
{
    // wait until the element is hittable
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"hittable == true"];
    [testCase expectationForPredicate:predicate evaluatedWithObject:element handler:nil];
    [testCase waitForExpectationsWithTimeout:5.0f handler:nil];

    // and then tap
    [self tap];
}

@end
sd2nnvve

sd2nnvve4#

你可以wait同时加载元素,我创建了这个扩展:

import XCTest

extension XCUIElement {
    func tap(wait: Int, test: XCTestCase) {
        if !isHittable {
            test.expectation(for: NSPredicate(format: "hittable == true"), evaluatedWith: self, handler: nil)
            test.waitForExpectations(timeout: TimeInterval(wait), handler: nil)
        }
        tap()
    }
}

像这样使用:

app.buttons["start"].tap(wait: 20, test: self)
5lwkijsr

5lwkijsr5#

对我来说,最可靠的方法是在元素没有被正确点击的地方添加sleep(1)。使用值小于1000usleep函数会导致不可靠的行为,例如正确的测试随机失败。

khbbv19g

khbbv19g6#

在我的情况下,问题是在按钮的风格。我使用SUI并将buttonStyle设置为.borderless。在我的名单(我猜)系统使非击中区水龙头。但是XCTAssertTrue(app.buttons["myButton"].isHittable)不会抛出错误。
也许能帮到某人

相关问题