Xcode UI testi - UI Test Başarısız - Arama alanı "İptal" düğmesine dokunduğunuzda görünür (AX eylemiyle) kaydırılamadı


85

Arama çubuğundaki 'İptal' düğmesine dokunarak arama alanını kapatmaya çalışıyorum.

Test senaryosu iptal düğmesini bulamıyor. Xcode 7.0.1'de iyi çalışıyordu

Düğmenin görünmesini beklemek için koşul ekledim. "İptal" düğmesine dokunduğumuzda test durumu başarısız oluyor

let button = app.buttons[“Cancel”]
let existsPredicate = NSPredicate(format: "exists == 1")

expectationForPredicate(existsPredicate, evaluatedWithObject: button, handler: nil)
waitForExpectationsWithTimeout(5, handler: nil)

button.tap() // Failing here

günlükler :

    t =     7.21s     Tap SearchField
t =     7.21s         Wait for app to idle
t =     7.29s         Find the SearchField
t =     7.29s             Snapshot accessibility hierarchy for com.test.mail
t =     7.49s             Find: Descendants matching type SearchField
t =     7.49s             Find: Element at index 0
t =     7.49s             Wait for app to idle
t =     7.55s         Synthesize event
t =     7.84s         Wait for app to idle
t =     8.97s     Type 'vinayak@xmd.net' into
t =     8.97s         Wait for app to idle
t =     9.03s         Find the "Search" SearchField
t =     9.03s             Snapshot accessibility hierarchy for com.test.mail
t =     9.35s             Find: Descendants matching type SearchField
t =     9.35s             Find: Element at index 0
t =     9.36s             Wait for app to idle
t =     9.42s         Synthesize event
t =    10.37s         Wait for app to idle
t =    10.44s     Check predicate `exists == 1` against object `"Cancel" Button`
t =    10.44s         Snapshot accessibility hierarchy for com.test.mail
t =    10.58s         Find: Descendants matching type Button
t =    10.58s         Find: Elements matching predicate '"Cancel" IN identifiers'
t =    10.58s     Tap "Cancel" Button
t =    10.58s         Wait for app to idle
t =    10.64s         Find the "Cancel" Button
t =    10.64s             Snapshot accessibility hierarchy for com.test.mail
t =    10.78s             Find: Descendants matching type Button
t =    10.78s             Find: Elements matching predicate '"Cancel" IN identifiers'
t =    10.79s             Wait for app to idle
t =    11.08s         Synthesize event
t =    11.13s             Scroll element to visible
t =    11.14s             Assertion Failure: UI Testing Failure - Failed to scroll to visible (by AX action) Button 0x7f7fcaebde40: traits: 8589934593, {{353.0, 26.0}, {53.0, 30.0}}, label: 'Cancel', error: Error -25204 performing AXAction 2003

@ Joe Masilotti herhangi bir fikir?
Vinpai

Sadece bir akıl sağlığı kontrolü, ancak ekrandaki İptal düğmesi mi yoksa kaydırılması mı gerekiyor? Öğelere kaydırmanın her zaman işe yaramadığı sorunlar olduğunu biliyorum.
Joe Masilotti

@JoeMasilotti iptal butonu ekran üzerindedir. İptal düğmesi, UISearchbar'ın bir parçası olan sistem varsayılan düğmesidir. [Self.buttons [@ "İptal"] dokunuşunu yaptığımda Xcode 7.0.1'de iyi çalışıyordu;
Vinpai

1
@Vinpai Düğmenize dokunmadan app.tables.cells.allElementsBoundByAccessibilityElement.countönce bir eklediğinizde ne olur ? Sadece merak ediyorum - bu bazen ekranı benim için 'yenilemeye' yardımcı oldu.
kekler88

@Konnor, önerdiğiniz API ile denedim, ancak İptal düğmesine dokunduğumda başarısız oluyor. Hata ayıklayıcıda application.buttons'u
sorguladığımda

Yanıtlar:


140

Sanırım burada mülk falseiçin "İptal" düğmesi dönüyor hittable, yani dokunulmasını engelliyor.

tap()Belgelerde görüyorsanız yazıyor

/*!
 * Sends a tap event to a hittable point computed for the element.
 */
- (void)tap;

Görünüşe göre XCode 7.1 ile işler bozulmuş. Kendimi (ve siz de;) bu sorunlardan uzak tutmak XCUIElementiçin, ele geçirilebilir olmasa bile öğeye dokunmaya izin veren bir uzantı yazdım. Aşağıdakiler size yardımcı olabilir.

/*Sends a tap event to a hittable/unhittable element.*/
extension XCUIElement {
    func forceTapElement() {
        if self.hittable {
            self.tap()
        }
        else {
            let coordinate: XCUICoordinate = self.coordinateWithNormalizedOffset(CGVectorMake(0.0, 0.0))
            coordinate.tap()
        }
    }
}

Şimdi olarak arayabilirsin

button.forceTapElement()

Güncelleme - Hızlı 3 için aşağıdakileri kullanın:

extension XCUIElement {
    func forceTapElement() {
        if self.isHittable {
            self.tap()
        }
        else {
            let coordinate: XCUICoordinate = self.coordinate(withNormalizedOffset: CGVector(dx:0.0, dy:0.0))
            coordinate.tap()
        }
    }
}

Düzeltme için teşekkürler. Benzer bir sorunla karşılaşıyordum cell.tap()ve bu sorunu çözdü . Xcode7.1'de bir şeyler değişmiş gibi görünüyor ve bazı elementlerin artık basılamaz olmasına neden oluyor
francisOpt

Xcode7.1'de 'basılabilir' olmayan özel bir navigationBar backButtonItem'im var ve bu çözüm benim için çalışıyorself.app.navigationBars["Nav Title"].staticTexts["Custom Back Btn Title"].forceTapElement()
Alex

Teşekkürler - Aynı sorunum için çalıştı.
Tache

7
Benim durumumda, musluk görünümün ortasındayken işe yaradı. Ofseti (0,5, 0,5) olarak değiştirin. let coordinate: XCUICoordinate = self.coordinateWithNormalizedOffset(CGVectorMake(0.5, 0.5))
Graham Perks

1
harika iş. Bunu görmeden önce neredeyse macbook'umu öldürmeye başlıyordum.
ChaosSpeeder

11

Benim için temel neden, dokunmak istediğim nesnelerin

  • gizli olarak ayarlandı (ve geri döndü)
  • kaldırıldı ve yeniden eklendi

Her iki durumda da isAccessibilityElementmülk daha falsesonraydı. Düzeltmek için geri trueayarlıyorum.


3
Bu tam olarak benim sorunumdu. Garip bir şekilde, iOS 11'de olmaya başladı (iOS 10'da iyi çalışıyordu).
Ricardo Sanchez-Saez

4

Bu soru, "Görünür (AX eylemine göre) Düğmesine kaydırılamadı" terimi etrafında Google sorguları için iyi bir sıralamaya sahiptir . Sorunun yaşı göz önüne alındığında, kabul edilen cevabın da önerdiği gibi bunun artık XCUITest çerçevesi ile ilgili bir sorun olmadığını düşünme eğilimindeydim.

Bu sorunun XCElementmevcut, ancak yazılım klavyesinin arkasına gizlenmiş olmasından kaynaklandığını buldum . Hata, çerçeve tarafından yayınlanır, çünkü var olan bir görünümü dokunulabilir bir görünüme kaydıramaz. Benim durumumda söz konusu düğme bazen yazılım klavyesinin arkasındaydı .

İOS Simulator'un yazılım klavyesinin bazı durumlarda (örneğin: makinenizde) kapatılıp bazılarında (örneğin: CI'nizde) açılmış olabileceğini buldum. Benim durumumda, bir makinede yazılım klavyesini kapattım ve varsayılan olarak diğerlerinde açıldı.

Çözüm: Arkasında olabilecek düğmelere dokunmayı denemeden önce klavyeyi kapatın.

Düğmeye dokunmadan önce klavyeyi açıkça kapatan bir yere dokunduğumda tüm ortamlarda sorunumu çözdüm.

Mevcut yanıtlayıcının istifa etmesini sağlamak için bazı eylemler ekledimFirstResponder. Metin görünümlerimin arkasındaki görüşler ilk yanıtlayanı istifa etmeye zorlayacak, bu yüzden son metin alanının hemen altındaki bir yere dokunuyorum.

 /// The keyboard may be up, dismiss it by tapping just below the password field
let pointBelowPassword = passwordSecureTextField.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 1))
pointBelowPassword.press(forDuration: 0.1)

2

Lütfen öğenin özelliğini kontrol edin, TableViewSectionHeader ile aynı sorunla karşılaşıyordum, dokunmaya çalışıyordum ama her noktada başarısız oluyordu

görüntü açıklamasını buraya girin


1

Sandy'nin çözümü bir süreliğine yardımcı olmuş gibi göründü ama sonra artık yok - sonra bunu şu şekilde değiştirdim:

func waitAndForceTap(timeout: UInt32 = 5000) {
    XCTAssert(waitForElement(timeout: timeout))
    coordinate(withNormalizedOffset: CGVector(dx:0.5, dy:0.5)).tap()
}

Esas nokta şu ki, sorun şu ki Hitable kontrolü bir istisna atıyor, bu kontrolü hiç yapmıyorum ve eleman bulunduktan sonra doğrudan koordinatlara gidiyorum.


0

Benim durumumda, düğmeyi örten programlı olarak eklenmiş bir UI öğesine sahipti.


0

Testleri çalıştırmak için AppCenter simülatörünü kullanıyorsanız, testleri yerel simülatörünüzle aynı cihaz sürümünde çalıştırdığınızdan emin olmalısınız. Bundan dolayı 3 günlük işimi kaybettim.


0

Öğenizi kaplayabilecek şeylerin ruhuna göre, RN hata ayıklayıcısını kısmen simgemin üstüne yerleştirdim:

görüntü açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.