2009-03-16 33 views
35

Tôi có một ứng dụng GWT mà tôi đang cố gắng viết một số thử nghiệm bằng cách sử dụng Selenium.Làm cách nào để chỉ chọn các phần tử hiển thị bằng XPath?

Tôi đang sử dụng XPath để xác định các yếu tố trên trang để kiểm tra. Sử dụng id sẽ không hoạt động vì giá trị id được GWT tạo tự động và có thể thay đổi. Mọi thứ bắt đầu diễn ra tốt đẹp khi tôi nhận ra rằng tôi có thể tìm thấy các nút theo nhãn của họ như sau:

//button[.='OK'] 

Tuy nhiên, khi tôi bắt đầu chạy nhiều thử nghiệm, tôi bắt đầu gặp sự cố. Tôi nhận ra rằng vấn đề là tất cả các "trang" khác nhau của ứng dụng GWT khi được tạo bởi Javascript vẫn còn trong HTML trong các phần tử <div> ẩn. Điều này có nghĩa là các bài kiểm tra Selenium của tôi đôi khi nhấp vào các nút ẩn thay vì nút hiển thị trong chế độ xem hiện tại.

Kiểm tra HTML với Firebug, có vẻ như GWT ẩn các phần tử <div> bằng cách thêm display: none vào thuộc tính style của chúng. Điều này có nghĩa tôi có thể tìm thấy tất cả các nút OK ẩn như sau:

//div[contains(@style,'display: none')]//button[.='OK'] 

này sẽ tìm thấy tất cả các nút OK ẩn, tức là các nút mà có một tổ tiên <div> được ẩn bằng cách display: none trong style.

Câu hỏi của tôi là: làm cách nào để sử dụng XPath để chỉ tìm các nút OK hiển thị? Làm cách nào để tìm các nút không có tổ tiên của các thành phần <div> với display: none trong số style?

Trả lời

46

này nên làm việc:

.//button[.='OK' and not(ancestor::div[contains(@style,'display:none')]) 
and not(ancestor::div[contains(@style,'display: none')])] 

EDIT:

Khái niệm đơn giản và hiệu quả hơn dưới đây:

//div[not(contains(@style,'display:none'))]//button[.='OK'] 

không hoạt động bình thường vì mỗi nút có ít nhất một div đó là có thể nhìn thấy trong tổ tiên của nó.

+0

Vậy là xong. Cảm ơn nhiều. –

+1

Cuối cùng không hoạt động nếu có một div khác trong cây dom không bị ẩn:

Fortega

+0

@Fortega và được nói trong văn bản xung quanh nó –

12

Selenium 2 Trình quản trị web cung cấp cho chúng ta tùy chọn phương thức isDisplayed() liên quan đến vấn đề này. Làm việc tốt bởi những người đóng góp selen.

+1

Điều đó có hiệu quả nếu thuộc tính ẩn hiển thị nằm trên phần tử cha và không phải là phần tử không? –

+2

Có, nhưng bạn phải kiểm tra điều này cho phần tử cụ thể, không thể khớp toàn bộ bộ sưu tập. – sitnarf

+1

Hãy cẩn thận vì điều này có thể làm tăng ngoại lệ 'StaleElementReferenceException' khi các phần tử được thay đổi giữa việc lấy (' find by * ') và kiểm tra khả năng hiển thị của nó bằng cách sử dụng' isDisplayed() '. – Blaise

-3
//div[contains(@style,'display: block')] 

Mã này sẽ tìm thấy yếu tố xpath

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