2010-01-08 21 views
10

Với ASP.NET các ID thẻ khá dễ bay hơi để làm cho các bài kiểm tra của tôi mạnh mẽ hơn, tôi muốn tìm các phần tử theo các văn bản nhãn của chúng. Tôi đã chơi một số với WatiN và nó thực hiện điều này một cách hoàn hảo nhưng dự án đó dường như đã chết ngày nay nên tôi nghĩ tôi cũng sẽ xem xét Selenium trước khi tôi quyết định về một khuôn khổ.Selenium locator cho <label for = "x">

Tôi có html mà trông giống như sau

<label for="ctl00_content_loginForm_ctl01_username">Username</label>: 
<input type="text" id="ctl00_content_loginForm_ctl01_username" /> 

Tôi không muốn gõ:

selenium.Type("ctl00_content_loginForm_ctl01_username", "xxx"); 

Đó là quá phụ thuộc vào ID. Trong WatiN tôi muốn viết:

browser.TextField(Find.ByLabelText("Username")).TypeText("xxx"); 

Có cách nào để làm điều này trong Selenium không?

+0

Xin lỗi bạn có ấn tượng WatiN là một dự án đã chết, nhưng nó vẫn còn sống và đá. Tháng 12 năm ngoái, chúng tôi đã phát hành WatiN 2.0 RC1. Jeroen van Menen –

+0

Vâng, bạn đã có lộ trình đề cập đến bản phát hành q1 2009 và đến cuối năm 2009 nó vẫn chưa được phát hành và lộ trình chưa được cập nhật. Ngoài ra, khi tôi gửi một bản vá cho diễn đàn yêu cầu tính năng giả mạo nguồn (để truy cập nguồn html thô), tôi không nhận được bất kỳ câu trả lời nào cả. Nó có vẻ giống như dự án khá chết. Tôi rất vui vì tôi đã sai. –

Trả lời

6

Tôi tin rằng bạn có thể làm điều này với những điều sau đây:

selenium.Type(selenium.getAttribute("//label[text()='Username']/@for"), "xxx"); 

Các văn bản() = 'Tên người dùng' chút được nhãn bạn muốn bằng cách innerHTML của nó, thì/@ cho phép bạn trở lại giá trị của thuộc tính "for" của nó.

Heads lên: này không được kiểm tra (! Xin lỗi cho điều đó) nhưng tôi nghĩ rằng nó sẽ làm việc, dựa trên một số dụng cụ xung quanh trong các plugin IDE

+0

Có vẻ đầy hứa hẹn. Tôi sẽ thử vào ngày mai. –

+0

Cảm ơn. Điều đó làm việc tốt (ngoại trừ GetAttribute nên được viết hoa). Cú pháp là hư không gần như là tốt đẹp như WatiN nhưng nó sẽ nhận được công việc làm. –

1

Có, bạn có thể sử dụng trình định vị XPath, CSS hoặc DOM để xác định phần tử của bạn. Trong ví dụ này, XPath của bạn có thể trông giống như // lable [@ for = 'ctl00_content_loginForm_ctl01_username'] để xác định nhãn cụ thể đó.

+0

Ngoại trừ nó không phải là nhãn tôi muốn xác định - đó là hộp nhập liệu. –

+0

Sau đó thay đổi XPath để tìm đầu vào đó - trong trường hợp này: // đầu vào [@ id = 'ctl00_content_loginForm_ctl01_username'] Đây là lời giải thích cho nó - bạn đang tìm kiếm tất cả các yếu tố đầu vào (vì thế //) trong đó id thuộc tính bằng ctl00_content_loginForm_ctl01_username – John

+0

Có, nhưng toàn bộ vấn đề của tôi là tôi không muốn bất kỳ ID nào trong mã thử nghiệm của mình vì chúng thay đổi ngay sau khi tôi thay đổi một cái gì đó trên trang. Có nhiều câu hỏi của tôi hơn là tôi có thể phù hợp với tiêu đề ... –

3

Ok, điều này có thể là một năm cũ nhưng những gì họ này Thao tác này sẽ chọn đầu vào đầu tiên bên dưới nhãn chứa văn bản 'Tên người dùng'.

//label[text()='Username']/input 

Tôi thường thích sử dụng chứa() như tôi thấy rằng một số các trình duyệt đang thêm không gian gây phiền nhiễu vào các yếu tố xuyên:

//label[contains(., 'Username')]/input 

Lưu ý rằng các dấu gạch chéo duy nhất trước khi nhập biểu thị nó sẽ chỉ nhìn một cấp xuống, nơi dấu gạch chéo kép sẽ kiểm tra tất cả các cấp dưới nhãn. Sử dụng XPather cho Firefox để tạo và kiểm tra XPath của bạn, nó rất hữu ích.

+0

Vâng, câu hỏi đó hơi cũ, nhưng tôi không nghĩ rằng tôi đã từng giải quyết vấn đề đó một cách rõ ràng. Vấn đề với đề xuất của bạn là nó yêu cầu đầu vào '' để _inside_ '

8

này hoạt động:

//input[@id=(//label[text()="Username"]/@for)] 

Giải thích: Vì bạn đang tìm kiếm đầu vào:

//input[@id=("ctl00_content_loginForm_ctl01_username")] 

thay thế "ctl00_content_loginForm_ctl01_username" bởi giá trị của thuộc tính của nhãn:

//label[text()="Username"]/@for 
+0

Tôi không biết bạn có thể sử dụng "truy vấn phụ" trong xpath. Tôi không còn quyền truy cập vào dự án mà tôi gặp sự cố này, vì vậy tôi không thể dễ dàng xác minh giải pháp. Nhưng có vẻ đầy hứa hẹn. Cảm ơn! –