2013-06-08 32 views
5

Thưa Selenium Webdriver chuyên gia,Đối sánh chuỗi() có được hỗ trợ trong Selenium Webdriver 2 không?

Tôi đang tự hỏi liệu chuỗi phù hợp với phương pháp trong Selenium Webdriver hoạt động đúng với đoạn mã sau trong Java:

if (property.findElements(By.xpath("./dl[@class='cN-featDetails']/dd[matches(class,'propertytype type-house']")).size() > 0) { // line 229 

Dưới đây là trang web xhtml nơi dòng 229 được đọc từ:

<dl class="cN-featDetails"> 
<dt class="proptype">Property type</dt> 
<dd id="ctl00_ctl00_Content_Content_SrchResLst_rptResult_ctl01_EliteListingTemplate_ddPropertyType" class="propertytype type-house" title="Property type: House">House</dd> 

Tuy nhiên, điều này dẫn đến các lỗi sau:

Address: 28B/171 Gloucester Street, Sydney 
Exception in thread "main" org.openqa.selenium.InvalidSelectorException: The given selector ./dl[@class='cN-featDetails']/dd[matches(class,'propertytype type-house'] is either invalid or does not result in a WebElement. The following error occurred: 
[InvalidSelectorError] Unable to locate an element with the xpath expression ./dl[@class='cN-featDetails']/dd[matches(class,'propertytype type-house'] because of the following error: 
[Exception... "The expression is not a legal expression." code: "51" nsresult: "0x805b0033 (NS_ERROR_DOM_INVALID_EXPRESSION_ERR)" location: " 

Tôi cũng đã thử matches(class,'propertytype.*$']") mà không thành công.

Tên của thay đổi lớp tùy thuộc vào việc tài sản là một ngôi nhà (loại nhà) hoặc căn hộ (loại-căn hộ) ... ..

Bất kỳ gợi ý về cách sử dụng regex trong các trận đấu để kiểm tra xem có giá trị/nút cây hợp lệ trong phần tử kiểu thuộc tính này?

Đoạn mã này đang tìm kiếm this URL.

Tôi đang sử dụng Selenium 2.25.0, Java 1.7.0_11 trên Windows XP & 7 nền tảng.

Lời khuyên của bạn sẽ được đánh giá cao.

+0

Loại tài sản
Nhà

Trả lời

9

Thật không may, matches() function is a part of XPath 2.0.

WebDriver sử dụng thư viện Wicked Good XPath chỉ hỗ trợ XPath 1.0.

Do đó, biểu thức XPath của bạn là bất hợp pháp và bạn nên viết lại nó để chỉ sử dụng các tính năng và chức năng từ XPath 1.0.

Tôi nghĩ bạn có thể chỉ cần thay thế cuộc gọi matches() trong trạng thái examply của mình với contains(). Điều đó nói rằng, đó là không phải được coi là phương pháp hay để đối sánh tên lớp thông qua , bởi vì type-house cũng sẽ khớp với type-houses. Ngoài ra, nếu bạn phù hợp với propertytype type-house và các lớp xảy ra theo thứ tự khác nhau, chúng sẽ không khớp. XPath không biết gì về các lớp cũng như về các danh sách được phân tách bằng dấu cách được sử dụng trong CSS. Để thảo luận thêm về điều này, xem ví dụ: this.

Bạn thực sự nên sử dụng một bộ chọn CSS thay vì:

dl.cN-featDetails > dd.propertytype.type-house 
+0

Ngoài ra, bạn đang thiếu một '@' infront của 'class' trong lệnh' matches() '. –

+1

Một cách xung quanh vấn đề chứa-phù hợp-quá-nhiều là sử dụng 'contains (concat ('', @class, '') ', type-house')'. –

+0

Đúng. Ngoài ra, có thể khắc phục vấn đề thứ tự các lớp theo thứ tự bằng cách sử dụng 'contains (@class," first-class ") và chứa (@class," second-class ")'. Lý tưởng nhất là bị xích với 'concat()' và có thể là 'normalize-space()'. –

-1

Như stack trace bạn nói:

Exception in thread "main" org.openqa.selenium.InvalidSelectorException:

chọn bạn không hợp lệ

thay vì:

./dl[@class='cN-featDetails']/dd[matches(class,'propertytype type-house'] 

Hãy thử:

./dl[@class='cN-featDetails']/dd[matches(class,'propertytype type-house')] 

(Lưu ý ngoặc thêm)

Selenium sẽ chỉ rơi trở lại Wicked Tốt XPath nếu trình duyệt tự nó không có một thực hiện XPath (thường IE). Vì vậy, điều này sẽ hoạt động trong các trình duyệt hiện đại có triển khai XPath. Để tương thích chéo Tôi sẽ đề nghị chuyển sang chứa() như đã nêu trong @ Slanec của câu trả lời

+0

Câu trả lời này không đúng. Cho đến nay, không có trình duyệt chính nào hỗ trợ XPath 2.0 - và do đó 'matches()' hiện _not_ làm việc với bất kỳ trình duyệt nào. –

+0

Không có gì mơ hồ trong câu trả lời của bạn.Bạn nói rằng nó _should_ làm việc, nhưng nó là hoàn toàn rõ ràng rằng nó không, trong mọi trường hợp, và nó không có gì để làm với cross-compatibilty hoặc cho dù một trong những sử dụng IE hay không. Nếu tôi chỉnh sửa phần đó, câu trả lời của bạn không còn trả lời câu hỏi ("cách sử dụng regex trong các kết quả phù hợp để kiểm tra xem có nút cây giá trị/hợp lệ trong phần tử kiểu thuộc tính này không?" Và "Các đối sánh chuỗi() được hỗ trợ trong Selenium Webdriver 2? "). –

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