2010-02-01 28 views
5

Tôi đã gặp lỗi liên tục với một số thử nghiệm java selenium-rc mà tôi cho rằng có liên quan đến trang có cuộc thăm dò ajax và tự động làm mới khi một số điều kiện được truy cập trên máy chủ. Trong trường hợp này, tôi không có cách nào yêu cầu selen để đợi trang tải, và vì vậy tôi chạy vào một loạt các lỗi ngẫu nhiên "Không thể truy cập document.body".Xử lý các trang tự làm mới từ selen

Vì vậy, có cách nào tôi có thể khiến selenium xử lý một cách duyên dáng tình huống này không? Nếu không, có cách nào tôi có thể phát hiện xem người dùng có phải là selen từ javascript của trang hay không và làm mới tự động không?

Nếu nó giúp chút nào, mã javascript trong trang trông giống như ...

var ajax = new Ajax(url, { 
    update: state, 
    method: 'get', 
    onComplete: function(message) { 
     if (some_condition) { 
      window.location.replace(unescape(window.location)); 
     } 
    } 
}); 
+0

@Thay đổi những gì thay đổi khi trang tải lại – AutomatedTester

+0

Một số liên kết đã bị tắt sẽ được bật lại - Không có gì liên quan đến thử nghiệm. Lý tưởng nhất là chúng tôi sẽ cập nhật trang sang trạng thái mới bằng ajax hoặc một cái gì đó, nhưng nỗ lực cần thiết để làm điều đó là rộng rãi so với cơ chế làm mới trang này. –

+0

Có vẻ như tôi có thể phát hiện đang chạy dưới selen với thứ gì đó như http://nerd.metrocat.org/2009/10/detecting-selenium hoặc http://thoughtstoblog.blogspot.com/2009/09/selenium-alert -and-confirm-in-pages.html. Tôi sẽ cho đi một ngày mai ... –

Trả lời

1

Giải pháp của tôi là để vô hiệu hóa làm mới trong javascript bằng cách gói nó trong một cái gì đó như sau ...

var isSeleniumActive = parent.seleniumAlert; 
if (isSeleniumActive) { 
    alert("Selenium"); 
} else { 
    alert("Not selenium"); 
} 

Tôi không chắc chắn nếu chức năng seleniumAlert ở đây là khả năng ốm quanh mãi mãi, vì vậy hãy nhận thức được nếu bạn đang dùng điều này mà bạn có thể dựa vào chi tiết thực hiện selen nội bộ của selen.

+0

Trông giống như một giải pháp tốt. Tôi muốn đặt câu hỏi là phải thay đổi ứng dụng của bạn cho phù hợp với thử nghiệm của bạn, nhưng có vẻ như bạn đã có ít lựa chọn. –

-1

Tôi nghĩ rằng bạn có thể tạm dừng, hoặc sử dụng một nhấp chuột và chờ đợi. Có a fewgood articles trên google. Chúc may mắn.

Chỉnh sửa cho nhận xét của bạn:

Làm thế nào về waitFor command?

+0

Rắc rối là, việc làm mới được kích hoạt bởi trang cơ bản, chứ không phải selen, vì vậy không có thời điểm nào mà selen có thể biết cần phải tạm dừng hoặc bấmAndWait. –

1

Một giải pháp có thể là luôn sử dụng waitForCondition sử dụng isElementPresent trước khi thử tương tác với ứng dụng đang thử nghiệm. Bạn có thể đặt phương thức sau vào một lớp cha để giữ cho các bài kiểm tra của bạn dễ đọc hơn. Ngoài ra, bạn có thể tạo các phương thức trợ giúp cho các lệnh Selenium phổ biến thực hiện việc chờ đợi này.

/** Waits for an element to be present */ 
public static void waitForElementToBePresent(String locator) { 
    session().waitForCondition("var value = selenium.isElementPresent('" + locator.replace("'", "\\'") + "'); value == true", "60000"); 
} 

Bạn cũng có thể muốn chờ yếu tố hiển thị, vì đợi nó hiển thị không phải lúc nào cũng đủ (tưởng tượng một hộp văn bản luôn tồn tại nhưng ẩn cho đến một điều kiện nhất định). Bạn có thể kết hợp với các phương pháp trên:

/** Waits for an element to be visible */ 
public static void waitForElementToBeVisible(String locator) { 
    waitForElementToBePresent(locator); 
    session().waitForCondition("var value = selenium.isVisible('" + locator.replace("'", "\\'") + "'); value == true", TIMEOUT); 
} 

Ngẫu nhiên, (Selenium 2) đội WebDriver đang làm việc trên có chờ đợi tiềm ẩn, đặc biệt để giải quyết các vấn đề AJAX nơi yếu tố đang không có mặt ngay lập tức.

+0

Không thể làm mới trang vẫn xảy ra sau khi waitForCondition hoàn thành (thành công) nhưng trước khi bước thử nghiệm tiếp theo bắt đầu, khiến bước tiếp theo thất bại? Giải pháp này có thể giúp nếu trang ở giữa làm mới khi waitForCondition bắt đầu mặc dù - Cảm ơn. –

+0

Thật không may nó vẫn là một khả năng, vâng. Cũng có thể có khả năng trang đó ở trạng thái nơi các lệnh trả về lỗi vì trang chưa tải bất kỳ thứ gì. Trong trường hợp này, tôi phải chờ tên cửa sổ tồn tại trong một dự án trước đó. –

+0

Đoán tôi sẽ phải xem xét cố gắng vô hiệu hóa làm mới khi chạy dưới Selenium bằng cách nào đó - Cảm ơn. –

0

Có tôi đang đối mặt với cùng một vấn đề và tôi sử dụng một dòng mã và nó giúp.

tôi đã nhận được báo lỗi về trang được nhận tự động refresh cộng cảnh báo này:

-1490472087141 rối WARN Sử dụng cấu trúc dữ liệu bị phản đối lập timeout

tất cả tôi sử dụng là

Thread.sleep(2000) 

và nó làm việc cho tôi.

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