2012-02-29 31 views
5

Trang web mà tôi đang thử nghiệm đang sử dụng loại trực tiếp. Trên các trang khác trên trang web của chúng tôi hiện không sử dụng loại trực tiếp, tôi không gặp phải vấn đề tương tự. Kịch bản tôi có là nơi trang mở ra, tôi nhập vào các trường bắt buộc khác nhau và nhấp vào nút lưu. Tại một số điểm giữa khi nó nhập vào một giá trị trong trường văn bản cuối cùng và khi nó nhấp vào nút lưu, các trường trước đây có giá trị sẽ bị xóa, và do đó tập lệnh không thể tiếp tục. Dưới đây là ví dụ về mã mà tôi đang chạy:selenium webdriver đang xóa các trường sau khi sendKeys đã điền trước đó

driver.findElement(By.id("sku")).clear(); 
driver.findElement(By.id("sku")).sendKeys(itemNo); 
driver.findElement(By.id("desktopThankYouPage")).clear(); 
driver.findElement(By.id("desktopThankYouPage")).sendKeys(downloadUrl); 
driver.findElement(By.id("mobileThankYouPage")).clear(); 
driver.findElement(By.id("mobileThankYouPage")).sendKeys(mobileDownloadUrl); 
driver.findElement(By.id("initialPrice")).clear(); 
driver.findElement(By.id("initialPrice")).sendKeys(initialPrice); 
driver.findElement(By.id("submitSiteChanges")).click(); 

Như tôi đã nói, thời gian nhập văn bản vào trường cuối cùng và thời gian nhấp vào lưu các trường trước đó có văn bản trong đó sẽ bị xóa và do đó thử nghiệm của tôi không thành công. Vấn đề là nó không phải lúc nào cũng xảy ra. Đôi khi thử nghiệm chạy tốt, thời gian khác nó không.

Tôi đã thử đặt Thread.sleep (x); trên tất cả các nơi để xem liệu tạm dừng tại các điểm nhất định có khắc phục được sự cố không. Tôi cũng đã thử sử dụng javascript để chờ trong nền cho bất kỳ ajax có thể đang chạy. Cũng có sự chờ đợi tiềm ẩn của driver.manage(). Timeouts(). ImplicitlyWait (10, TimeUnit.SECONDS). Không ai trong số đó dường như đã tạo ra bất kỳ sự khác biệt nào.

Tôi đang chạy phiên bản 2.13 của máy chủ selen và tất cả các thử nghiệm của tôi chạy trên Firefox 8.

Bất kỳ giúp đỡ về vấn đề này sẽ được đánh giá rất nhiều!

+0

Bạn đã xác nhận rằng các giá trị đang được đặt thực sự được đặt như thế nào. Điều gì xảy ra trong mã KO của bạn sau khi bạn nhấp vào gửi? Các phần tử dom ràng buộc với KO có được hiển thị như một phần của mẫu không? – madcapnmckay

+0

Có, tôi đã xác minh rằng các giá trị có mặt trong các trường trước khi nhấp vào nút gửi. Trong thực tế đôi khi thử nghiệm vượt qua. Nút gửi lấy đối tượng bị ràng buộc của chúng tôi và chuyển đổi nó thành JSON và gửi nó qua ajax đến API của chúng tôi. Dường như trước khi chúng tôi tạo JSON, trình điều khiển web sẽ xóa một số trường. –

+0

Tôi nghi ngờ rằng trình điều khiển web đang xóa các trường. Khả năng nhiều khả năng là trang của bạn đang xóa các trường do vấn đề về thời gian hoặc có thể là lỗi trong mã xử lý sự kiện, tuy nhiên bạn đã đề cập việc thêm ngủ dường như không khắc phục được sự cố. Bạn đã thêm một giấc ngủ rất dài (30 giây) trước khi nhập văn bản vào bất kỳ trường nào để loại trừ hoàn toàn vấn đề về thời gian? Bạn có thêm trễ hai giây giữa việc nhập văn bản vào từng trường để loại trừ vấn đề về thời gian không? –

Trả lời

1

Tôi gặp vấn đề tương tự. Tôi cũng đoán rằng mã của bạn hoạt động tốt trong Chrome chứ không phải firefox và nó luôn hoạt động khi bạn thực hiện thủ công?

Dù sao thì, vấn đề có thể là Selenium không thực sự cư xử giống như một người dùng thực, và không kích hoạt các sự kiện tương tự. Khi bạn "gửi" biểu mẫu, đôi khi nó sẽ không thực thi sự kiện "thay đổi" trên vùng văn bản, có nghĩa là nó sẽ không thay đổi.

Tôi đã kiểm tra vấn đề tương tự Backbone.modelbinding, sử dụng sự kiện "thay đổi" để cập nhật mô hình từ biểu mẫu. Knockout cũng sử dụng sự kiện "thay đổi", nhưng may mắn thay nó cũng có thể sử dụng sự kiện "keyup". Xem valueUpdate in the docs:

<input data-bind="value: someValue, valueUpdate: 'keyup'" /> 

Dù sao, đó reproducibly giải quyết nó cho tôi, và didnt cần bất kỳ ngủ một khi tôi đã có điều đó làm. Nhược điểm là bạn muốn chạy các sự kiện nhiều hơn là cần thiết trong sản xuất, để làm cho các bài kiểm tra làm việc. Một nhược điểm khác là bạn nếu bạn muốn chạy một số mã khi một giá trị thay đổi, bây giờ bạn sẽ nhận được một sự kiện cho mỗi lần nhấn phím thay vì một sự kiện trên mỗi lần thay đổi trường, điều này đôi khi làm mất đi.

Có một giải pháp khác, đó là làm cho Selenium tự cháy sự kiện thay đổi, ví dụ: Selenium IE change event not fired. Nó cũng là tối ưu, nhưng bạn có thể làm gì.

Bạn cũng có thể thử tập trung vào nút trước khi bạn nhấp vào nút đó. Không biết nếu điều đó sẽ làm việc, tôi đã không thử nó.

4

Firefox có bug ngăn một số sự kiện không được thực hiện trong khi cửa sổ trình duyệt bị mất tiêu điểm. Điều này có thể là một vấn đề khi bạn chạy thử nghiệm tự động hóa của mình - điều này có thể đang nhập ngay cả khi cửa sổ bị mất tiêu điểm.

Vấn đề là cập nhật mô hình loại trực tiếp được kích hoạt (theo mặc định) với sự kiện change. Nếu nó không được thực thi, mô hình cơ bản của nó sẽ không được cập nhật.

Để khắc phục vấn đề này, tôi kích hoạt sự kiện thay đổi "bằng tay", tiêm javascript vào bài kiểm tra của tôi .:

//suppose "element" is an input field 
element.sendKeys("value"); 
JavascriptExecutor jsExecutor = (JavascriptExecutor) driver; 
jsExecutor.executeScript("$(arguments[0]).change();", element); 

Như bạn có thể đã nhận thấy, tôi đang sử dụng jQuery để kích hoạt sự kiện thay đổi. Nếu bạn không sử dụng jQuery trên ứng dụng của mình, bạn có thể kiểm tra here cách kích hoạt nó bằng javascript vani.

Hy vọng rằng sẽ giúp ai đó.

+0

Nó chắc chắn đã giúp tôi! và FWIW, trong C# nó là trình điều khiển 'var jsExecutor = (IJavaScriptExecutor); jsExecutor.ExecuteScript ("$ (đối số [0]). thay đổi();", phần tử); ' – LosManos

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