2012-08-23 42 views
7

Tôi đang viết các bài kiểm tra chức năng và xử lý một cửa sổ phương thức làm mờ dần dần.Trong Geb, sự khác biệt giữa hiển thị và hiện tại là gì?

Sự khác biệt giữa hiển thị và hiện tại là gì?

Ví dụ tôi có:

settingsModule.container.displayed and settingsModule.container.present 

nơi settingsModule đại diện cho cửa sổ modal của tôi.

Khi kiểm tra cửa sổ modal của tôi (các phương thức từ bootstrap của Twitter), tôi thường làm điều này:

def "should do ... "() { 
    setup: 
    topMenu.openSettingsModal()  

    expect: 
    settingsModule.timeZone.value() == "Asia/Hong_Kong" 

    cleanup: 
    settingsModule.closeSettingsModal() 
} 

def "should save the time zone"() { 
     setup: 
     topMenu.openSettingsModal()    
     settingsModule.timeZone = "Japan" 

     when:    
     settingsModule.saveSettings()  

     then: 
     settingsModule.alertSuccess.size() == 1 
     settingsModule.alertSuccess.text() == "Settings updated" 

     when: 
     settingsModule.saveSettings()  

     then: 
     settingsModule.alertSuccess.size() == 1 

     cleanup: 
     settingsModule.closeSettingsModal() 
    } 

và cứ tiếp tục. Trong các mô-đun của tôi, tôi có:

void openSettingsModal() {     
     username.click() 
     settingsLink.click()    
    } 

void closeSettingsModal() { 
     form.cancel().click()  
    } 

Tôi luôn nhận được khiếu nại: "Phần tử phải được hiển thị để nhấp".

Trong openSettingsModal và closeSettingsModal của tôi, tôi đã thử nhiều kết hợp waitFor với khoảng thời gian và sử dụng hiện tại hay không ... Không thể tìm ra.

Mọi con trỏ sẽ được đánh giá cao. Cảm ơn!

Trả lời

6

Tôi nghĩ sự khác biệt chính là hiện tại sẽ kiểm tra rằng có một phần tử trong DOM của bạn, trong khi các kiểm tra được hiển thị trên khả năng hiển thị của phần tử này.

Hãy nhớ rằng trình quản lý web mô phỏng trải nghiệm thực tế của người dùng đang sử dụng và nhấp vào trang web bằng chuột, vì vậy nếu phần tử không hiển thị với họ, họ sẽ không thể nhấp vào nó.

Tôi tự hỏi liệu sự cố của bạn có liên quan đến cài đặtLiên kết không nằm trong DOM khi trang được tải lần đầu hay không. Nếu bạn đang chờ đợi một hộp thoại để bật lên và một liên kết đến sống trong hộp thoại này, sau đó bạn có thể muốn thiết lập một cái gì đó giống như

content{ 
    settingsLink(required: false) { $('...' } 
    settingsModal(required: false) { $('#modalDialog') } 
} 

waitfor của bạn sẽ giống như

username.click() 
waitFor{ settingsModal.displayed } 
settingsLink.click() 

tôi sẽ gắn bó với cuốn sách của các quy ước geb và chỉ sử dụng được hiển thị mọi lúc.

Geb Manual - Determining visibility

+0

Tôi đã thử giải pháp của bạn nhưng giải pháp này không hoạt động. Giải pháp tôi đề xuất đi cùng hướng với một số chỉnh sửa. Cảm ơn bạn! – ontk

4

Cảm ơn câu trả lời của bạn. Tôi đã thực sự có thể giải quyết vấn đề của mình.

Vấn đề là cửa sổ phương thức có hoạt ảnh 500ms. Việc mở và đóng cửa sổ vài lần trong các thử nghiệm của tôi khiến chúng thành công/thất bại không nhất quán.

Điều tôi đã làm là gắn kết sự kiện "được hiển thị" do plugin cung cấp. Tôi đã kết thúc việc thêm một lớp "hiển thị" vào phương thức và kiểm tra nó mỗi 100ms trong 1s.

void openSettingsModal() {  
    username.click() 
    settingsLink.click() 
    waitFor (1, 0.1) { $("#settingsModal", class: "shown").size() == 1 } 
} 

void closeSettingsModal() { 
    form.cancel().click() 
    waitFor (1, 0.1) { $("#settingsModal", class: "shown").size() == 0 }  
} 

Một lưu ý phụ, các kiểm tra không thành công trong Chrome và Firefox NHƯNG đã chuyển qua IE! Tôi đoán rằng bởi vì IE 8 không hỗ trợ hình ảnh động mà các bài kiểm tra của tôi đã đi qua.

Giờ tất cả đều tốt.

Tôi hy vọng nó sẽ giúp ai đó một ngày nào đó!

0

Nơi chúng tôi có thể sử dụng displayed?

Nếu một phần tử cụ thể bạn đang xóa hoặc xóa, nếu phần tử vẫn còn trong DOM và không được hiển thị trong trang, bạn có thể sử dụng khẳng định thatelement.displayed == false để đảm bảo yếu tố đó không được hiển thị trên trang (nhưng vẫn hiển thị trong DOM)

Nơi chúng tôi có thể sử dụng present?

Trong ví dụ tương tự như trên, sau khi gỡ bỏ, nếu yếu tố này không được tìm thấy tại DOM, bạn nên sử dụng hiện tại để xác minh

assert thatelement.present == false 

Hy vọng bạn hiểu ....

Thêm vào ở trên, hiện tại cần nhiều thời gian hơn trong việc thực thi tập lệnh