2013-05-30 42 views
10

Tôi có một ứng dụng đang sử dụng KnockoutJS và tôi đang cố gắng viết một số thử nghiệm kiểm tra biểu mẫu. Nếu bạn không biết KnockoutJS, câu chuyện ngắn cho nó là nó cung cấp các ràng buộc từ quan điểm của tôi với mô hình dữ liệu của tôi. Điều này có nghĩa là khi tôi nhập một giá trị vào trường nhập, đối tượng bên dưới của tôi sẽ tự động được cập nhật với giá trị trường nhập đó. Điều này được thực hiện thông qua một sự kiện thay đổi theo mặc định.WebDriver: Thay đổi sự kiện không kích hoạt

Sự cố tôi gặp phải là khi kiểm tra WebDriver của tôi đang nhập vào trường, sự kiện thay đổi không kích hoạt để mô hình dữ liệu cơ bản của tôi không có giá trị thích hợp. Điều này làm cho việc xác thực biểu mẫu của tôi thất bại khi nó không nên.

Tôi đã làm mọi thứ tôi có thể tìm thấy trên internet để thực hiện công việc này. Tôi đã:

  1. gửi tab chính
  2. nhấp chuột từ các trường mẫu
  3. gửi mã Javascript để bắn tập trung và làm mờ các sự kiện (xác nhận xảy ra trên blur)
  4. nhấp lĩnh vực hình thức trước khi gõ
  5. bộ chờ đợi chỉ trong trường hợp đó là một vấn đề thời gian
  6. thay đổi KnockoutJS để cập nhật trường nhập trên afterkeydown

Không ai trong số này đã làm việc cho tôi. Tôi cần sự giúp đỡ.

Ngoài ra, tôi đã xác minh rằng đây không phải là sự kiện sủi bọt khi tôi xóa tất cả các sự kiện khác một cách rõ ràng, chỉ để lại sự kiện thay đổi KnockoutJS.

cho giải pháp mà tôi đang tìm kiếm là công cụ phù hợp với tất cả trình điều khiển trình duyệt (... ít nhất là trình duyệt IE, FF, Chrome, Safari) và không yêu cầu sử dụng jQuery.

Mọi trợ giúp sẽ được đánh giá cao.

Đây là đoạn mã tương đối Tôi đang sử dụng để gõ giá trị vào trường:

// find element 
WebElement input = this.element.findElement(By.className("controls")) 
           .findElement(By.tagName("input")); 

// to set focus? 
input.click(); 

// erase any existing value (because clear does not send any events 
for (int i = 0; i < input.getAttribute("value").length(); i++) { 
    input.sendKeys(Keys.BACK_SPACE); 
} 

// type in value 
input.sendKeys(text); 

// to fire change & blur? (doesnt fire change) 
//input.sendKeys(Keys.TAB); 

// to fire change & blur? (doesnt fire change) 
driver.findElement(By.tagName("body")).click(); 
+0

Vì vậy, nếu tôi hiểu biết, nó cập nhật 'lĩnh vực input' với mỗi đột quỵ quan trọng? – Brian

+0

Hãy tha thứ cho tôi vì đã đặt câu hỏi có khả năng ngớ ngẩn, nhưng trang có đang hoạt động chính xác khi bạn tương tác với nó một cách thủ công trong trình duyệt? tức là nếu bạn xem trang trong trình duyệt, hãy nhập trường văn bản và tab ra khỏi trường văn bản, mô hình có đang được cập nhật không? – RodneyTrotter

+1

@Brian trường nhập được cập nhật bởi người dùng. mô hình dữ liệu cơ bản được cập nhật thành giá trị trong trường đầu vào khi sự kiện onchange kích hoạt (ít nhất nó được cho là). Và nếu tôi thay đổi giá trị cơ bản trong mô hình dữ liệu, trường nhập sẽ được tự động cập nhật thành giá trị mới. Đây là tất cả được cung cấp bởi KnockoutJS. – loesak

Trả lời

4

Vì vậy, tôi tin rằng tôi đã phát hiện ra sự cố của mình. Tôi hoàn toàn thừa nhận đây là PEBKAC. Tôi đã quên rằng WebDriver có vấn đề nếu cửa sổ trình duyệt không hoạt động tập trung vào máy (mà vẫn còn lạ với tôi). Khi tôi đang gỡ lỗi vấn đề, tôi đã sử dụng trình soạn thảo của mình để xem qua mã. Bằng cách chạy mã bình thường và không xóa tiêu điểm khỏi trình duyệt, các sự kiện sẽ phát sinh như mong đợi bằng cả ba giải pháp (tab, nhấp chuột và javascript).

Tôi có một dự án mẫu hiển thị tất cả ba phương pháp, tuy nhiên tôi là một noob chính với git và github và đang gặp sự cố khi phân phối dự án. Khi tôi tìm ra điều đó, tôi sẽ chia sẻ dự án với tất cả các bạn.

EDIT: Có mã ví dụ trên GitHub (https://github.com/loesak/knockout.webdriver.change.event.test). Bạn có thể khởi động dự án dưới dạng webapp trong máy chủ và chạy thử nghiệm theo cách thủ công hoặc bạn có thể chạy thử nghiệm qua maven (mvn clean install). Tôi đã không đặt rất nhiều nỗ lực vào việc này để làm việc mạnh mẽ vì vậy nó là giả định bạn đã cài đặt Firefox và cổng 8080 được mở.

EDIT: Cố định tuyên bố cảng số

+0

Chúc mừng bạn đã giải quyết được sự cố, +1. – Brian

3

Vì vậy, tôi đã tìm thấy một cách để làm việc xung quanh vấn đề này cho bây giờ, nhưng cho đến nay tôi tin rằng đây là giải pháp đúng. Điều này không phá vỡ quy tắc của tôi về việc không sử dụng jQuery, tuy nhiên tôi cảm thấy điều này là ổn cho tôi khi KnockoutJS yêu cầu jQuery được tải. Có lẽ có một cách JavaScript đơn giản để làm điều này. Tôi đã thử nghiệm điều này với FireFox, Safari và PhantomJS. Tôi cho rằng nó sẽ hoạt động tốt trong Chrome. Tôi không đưa ra lời hứa cho Internet Explorer.

Tôi là NOT sẽ đánh dấu câu trả lời này là câu trả lời đúng. Giải pháp chính xác nên được thông qua trình duyệt WebDriver bắn các sự kiện thích hợp. Chỉ khi tôi tin rằng điều này là không thể thông qua WebDriver tôi sẽ đánh dấu điều này là câu trả lời đúng.

// find element in question 
WebElement input = this.element.findElement(By.className("controls")) 
           .findElement(By.tagName("input")); 

// click it to fire focus event 
input.click(); 

// erase any existing value 
for (int i = 0; i < input.getAttribute("value").length(); i++) { 
    input.sendKeys(Keys.BACK_SPACE); 
} 

// enter in desired text 
input.sendKeys(text); 

// fire on change event (WebDriver SHOULD DO THIS) 
((JavascriptExecutor) driver).executeScript(
     "$(arguments[0]).change(); return true;" 
    , input); 

// click away to fire blur event 
driver.findElement(By.tagName("body")).click(); 
+0

Nếu bạn có thể cung cấp một kịch bản có thể lặp lại và ** chứng minh ** đây là sự cố với WebDriver, hãy gửi một lỗi. – Arran

+0

vì vậy tôi đã tạo một dự án để tái tạo điều này và khi làm như vậy tôi đã tìm ra được vấn đề. trong ngắn hạn, đó là một sai lầm ma quái. Tôi muốn liên kết với dự án demo nhưng git noobness của tôi đang ngăn cản tôi kiểm tra trong dự án. – loesak

Các vấn đề liên quan