Open4

XCUITest: StoreKitのダウングレードのテストがおかしい

kabeyakabeya

XCUITestを使って、StoreKitを使ったサブスク購入処理のテストをしているんですが。

ダウングレードとなる商品の購入を画面から手動でボタンタップで実行したときと、XCUITestからbutton.tap()で実行したときとで、微妙にトランザクションの発生の仕方が違うような気がするんです。
ちょっとまだ詳しく分かってませんが。

kabeyakabeya

XCUITestのほうは、テストケースの冒頭でsession.disableDialogs = trueをやっていたんですが、これをやる場合とやらない場合(=確認ダイアログが出るので手動でタップする必要があるけども)とで、トランザクションの発生の仕方が変わるようです。

どう変わっているのかよく分かっていませんが、やる場合とやらない場合とで通るパスが違っているのは確かです。

微妙なタイミングのような気もしますが。

kabeyakabeya

で、問題はsession.disableDialogs = trueをやらないで、テストの完全自動化ができるのか、ということなんです。

確認ダイアログが出るんですが、これは自分のAppから出てるのではなくOS側の別アプリから出ています。
(このため、確認ダイアログが出た状態でテストやデバッグを中断すると、自分のAppは消えても確認ダイアログは残ったままです)

XCUITestをレコーディングモードで実行すると、app.buttons["サブスクリプションに登録"].tap()ってレコーディングされますが、実際それでテストを作っても、そんなボタンありませんよ?って出ます。

つまりこの確認ボタンをXCUITestから押せないのです。なので自動では進まない。ちょっとウェイトを入れて自分で押すしかない。

えーどうしよって思っていたら、StackOverflowに参考になるコメントがありました。

https://stackoverflow.com/questions/71399953/how-do-i-target-in-app-purchase-drawer-element-with-xcuitest

上記を参考に、以下のような関数を作りました。

    func tapConfimationButtons() {
        let springBoard =  XCUIApplication(bundleIdentifier: "com.apple.springboard")
        springBoard.buttons["サブスクリプションに登録"].tap()
        //app.buttons["サブスクリプションに登録"].tap()
        springBoard.alerts["You’re all set."].scrollViews.otherElements.buttons["OK"].tap()
    }

購入ボタンをタップしたあとに上記関数を呼ぶと購入が進んでいきます。

kabeyakabeya

ちなみに、トランザクションの発生の仕方が変わる条件が、スクラップのタイトルにつけた「ダウングレード」だけなのかどうかはまだ詳しく見ていません。