2008-10-29 22 views
101

Tôi sử dụng XPather Browser để kiểm tra biểu thức XPATH của tôi trên trang HTML.Sử dụng XPATH để tìm kiếm văn bản có chứa  

Mục tiêu cuối cùng của tôi là sử dụng các biểu thức này trong Selenium để kiểm tra giao diện người dùng của tôi.

tôi có một tập tin HTML với một nội dung tương tự như sau:

 
<tr> 
    <td>abc</td> 
    <td>&nbsp;</td> 
</tr> 

Tôi muốn chọn một nút với một văn bản có chứa chuỗi "&nbsp;".

Với chuỗi bình thường như "abc", không có vấn đề gì. Tôi sử dụng XPATH tương tự như //td[text()="abc"].

Khi tôi thử với một XPATH như //td[text()="&nbsp;"], nó sẽ không trả về gì cả. Có quy tắc đặc biệt nào liên quan đến các văn bản có "&" không?

+0

Chuyển đổi XSL thực tế của bạn có trả lại không có gì không? Hay chỉ Xpather? –

Trả lời

82

Có vẻ như OpenQA, những người đứng sau Selenium, đã giải quyết vấn đề này. Họ đã xác định một số biến để đối sánh một cách rõ ràng khoảng trắng. Trong trường hợp của tôi, tôi cần sử dụng XPATH tương tự như //td[text()="${nbsp}"].

tôi sao chép ở đây các văn bản từ OpenQA liên quan đến vấn đề này (tìm thấy here):

HTML tự động trở lại bình thường khoảng trắng trong các yếu tố, bỏ qua hàng đầu/dấu không gian và chuyển đổi thêm dấu cách, các tab và newlines thành một không gian đơn. Khi Selen đọc văn bản ngoài trang, nó cố gắng sao chép hành vi này, vì vậy bạn có thể bỏ qua tất cả các tab và dòng mới trong HTML của bạn và xác nhận dựa trên cách văn bản hiển thị trong trình duyệt khi hiển thị. Chúng tôi thực hiện việc này bằng cách thay thế tất cả khoảng trắng không hiển thị (bao gồm cả không gian phá vỡ "&nbsp;") với một không gian đơn . Tất cả các dòng mới có thể nhìn thấy (<br>, <p><pre> định dạng dòng mới) phải được giữ nguyên.

Chúng tôi sử dụng cùng một logic chuẩn hóa trên văn bản của trường hợp kiểm tra Selen HTML bảng. Điều này có một số lợi thế của . Trước tiên, bạn không cần phải xem mã nguồn HTML của trang để tìm ra xác nhận của bạn nên là; Các ký hiệu "&nbsp;" là vô hình cho người dùng cuối và vì vậy bạn không nên phải lo lắng về chúng khi viết kiểm tra Selenese. (Bạn không cần phải đặt "&nbsp;" đánh dấu trong trường hợp thử nghiệm của bạn để assertText trên một lĩnh vực có chứa "&nbsp;".) Bạn cũng có thể đặt thêm dòng mới và không gian trong Selenese của bạn <td> thẻ; vì chúng tôi sử dụng cùng một logic bình thường trên trường hợp thử nghiệm như chúng tôi thực hiện trên văn bản, chúng tôi có thể đảm bảo xác nhận đó và văn bản được trích xuất sẽ khớp chính xác.

Điều này tạo ra một chút vấn đề trên những dịp hiếm hoi đó khi bạn thực sự muốn/cần chèn thêm khoảng trống trong trường hợp thử nghiệm của bạn. Ví dụ: bạn có thể cần phải nhập văn bản vào một trường như mục này: "foo". Nhưng nếu bạn chỉ cần viết <td>foo </td> trong trường hợp thử nghiệm Selenese của bạn, chúng tôi sẽ thay thế không gian bổ sung chỉ với một không gian.

Sự cố này có giải pháp đơn giản. Chúng tôi đã xác định một biến trong Selenese, ${space}, có giá trị là một không gian duy nhất. Bạn có thể sử dụng ${space} để chèn khoảng trắng sẽ không được tự động cắt , như sau: <td>foo${space}${space}${space}</td>. Chúng tôi cũng đã bao gồm một biến ${nbsp}, mà bạn có thể sử dụng để chèn một không gian không phá vỡ.

Lưu ý rằng XPath làm không bình thường hóa khoảng trắng theo cách chúng ta làm. Nếu bạn cần viết một XPath như //div[text()="hello world"] nhưng HTML của liên kết thực sự là "hello&nbsp;world", bạn sẽ cần phải chèn một thực tế "&nbsp;" vào test Selenese của bạn để làm cho nó phù hợp, như thế này: //div[text()="hello${nbsp}world"].

0

Tìm kiếm &nbsp; hoặc chỉ nbsp - bạn đã thử cái này chưa?

+0

Tôi nhận ra rằng điều này sẽ làm việc nhưng nó không chính xác chắc chắn về những gì tôi tìm thấy. Phải có một cách trong XPATH để mã hóa một cách nhất định để phù hợp với những gì tôi đang tìm kiếm. – Bergeroy

+0

Có lẽ tôi nên nhìn về phía cụm từ thông dụng. – Bergeroy

3

Hãy thử sử dụng thực thể thập phân &#160; thay vì thực thể được đặt tên. Nếu điều đó không hiệu quả, bạn có thể chỉ cần sử dụng unicode character for a non-breaking space thay vì thực thể &nbsp;.

(Lưu ý:. Tôi không thử điều này trong XPather, nhưng tôi đã thử nó trong Oxygen)

16

tôi thấy tôi có thể làm cho trận đấu khi tôi nhập vào một không gian không bị phá hủy mã hóa cứng (U + 00A0) bằng cách nhập Alt + 0160 trên Windows giữa hai dấu ngoặc kép ...

//table[@id='TableID']//td[text()=' '] 

đã làm việc cho tôi bằng thẻ đặc biệt.

Từ những gì tôi đã hiểu, tiêu chuẩn XPath 1.0 không xử lý việc thoát khỏi các ký tự Unicode. Có vẻ như có chức năng cho điều đó trong XPath 2.0 nhưng có vẻ như Firefox không hỗ trợ nó (hoặc tôi đã hiểu nhầm điều gì đó). Vì vậy, bạn phải làm với mã địa phương. Xấu xí, tôi biết.

Thực ra, có vẻ như chuẩn đang dựa vào ngôn ngữ lập trình bằng XPath để cung cấp trình tự thoát Unicode chính xác ... Vì vậy, bằng cách nào đó, tôi đã làm đúng.

+0

Sử dụng Xpather 1.4.1 trong Firefox 2, // td [text() = ''] không cho kết quả nào. –

+0

Xin lỗi. Nó không hiệu quả với tôi. Mục tiêu cuối cùng của tôi là sử dụng nó trong Selenium để kiểm tra các giao diện Web của tôi. Bản thân Selen giữ các biểu thức thử nghiệm trong một cấu trúc XML và việc gõ Alt Windows dường như bị mất theo cách này. Ngoài ra, số   của tôi trả về dưới dạng XML. – Bergeroy

+0

Zack, như tôi đã viết, bạn phải thay thế khoảng trống giữa hai dấu ngoặc kép bằng ký tự được Alt + 0160 tạo ra (trên bàn phím số). – PhiLho

1

tôi không thể có được một trận đấu sử dụng Xpather, nhưng sau đây làm việc cho tôi với đồng bằng file XML và XSL trong Microsoft Notepad XML:

<xsl:value-of select="count(//td[text()='&nbsp;'])" /> 

Các giá trị trả về là 1, mà là giá trị đúng trong thử nghiệm của tôi trường hợp.

Tuy nhiên, tôi đã phải khai báo nbsp như một thực thể trong XML của tôi và XSL sử dụng như sau:

<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp "&#160;"> ]> 

Tôi không chắc chắn nếu điều đó giúp bạn, nhưng tôi đã có thể thực sự tìm nbsp bằng cách sử dụng biểu thức XPath.

Chỉnh sửa: Mẫu mã của tôi thực sự chứa các ký tự '& nbsp;' nhưng cú pháp JavaScript làm nổi bật chuyển đổi nó thành ký tự khoảng trắng. Đừng lừa dối!

+0

Bạn có thể chỉnh sửa mẫu mã của mình giống như nó đã được thực hiện cho mẫu trong câu hỏi của tôi. Thay thế thực thể nbsp của bạn theo & nbsp ;. – Bergeroy

1

Gấu nhớ rằng một bộ xử lý XML tiêu chuẩn tuân thủ sẽ thay thế bất kỳ tham chiếu thực thể khác hơn năm người XML tiêu chuẩn (&amp;, &gt;, &lt;, &apos;, &quot;) với nhân vật tương ứng trong mã hóa mục tiêu do thời gian Các biểu thức XPath được đánh giá. Với hành vi đó, các đề xuất của PhiLho và jsulak là cách để đi nếu bạn muốn làm việc với các công cụ XML. Khi bạn nhập &#160; trong biểu thức XPath, nó sẽ được chuyển đổi thành chuỗi byte tương ứng trước khi biểu thức XPath được áp dụng.

+1

Không phải nếu bạn thử/sử dụng XPath trong XPather (GUI) hoặc trong JavaScript (không tự động thay thế các thực thể, vì chúng tôi không có trong XML). Lời khuyên tốt trong các môi trường XML khác (XSTL?). – PhiLho

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