2009-09-09 35 views
9

Tôi đang sử dụng selen RC và tôi muốn, ví dụ, để có được tất cả các yếu tố liên kết với thuộc tính href trận đấu rằng:Làm thế nào để sử dụng regex trong Locators selen

http://[^/]*\d+com 

Tôi muốn sử dụng:

sel.get_attribute('//a[regx:match(@href, "http://[^/]*\d+.com")]/@name') 

sẽ trả về danh sách thuộc tính tên của tất cả các liên kết phù hợp với regex. (hoặc một cái gì đó giống như nó)

nhờ

+0

Vì vậy, những gì không hoạt động và theo cách nào nó không hoạt động? Bạn có thể đăng HTML (hoặc một đoạn của nó) mà bạn đang so khớp không? –

+0

@Paul, ví dụ và phương thức get_attribute() chỉ trả về một mục duy nhất, không phải danh sách. Poster là yêu cầu những gì tương đương cho việc trả về một danh sách các thuộc tính chẳng hạn. – David

Trả lời

3

Bạn có thể sử dụng getAllLinks lệnh Selenium để có được một mảng của các id của các liên kết trên trang web, mà bạn có thể sau đó lặp qua và kiểm tra href sử dụng getAttribute, trong đó có định vị theo sau là một @ và tên thuộc tính. Ví dụ trong Java này có thể là:

String[] allLinks = session().getAllLinks(); 
List<String> matchingLinks = new ArrayList<String>(); 

for (String linkId : allLinks) { 
    String linkHref = selenium.getAttribute("id=" + linkId + "@href"); 
    if (linkHref.matches("http://[^/]*\\d+.com")) { 
     matchingLinks.add(link); 
    } 
} 
+0

Tôi không nghĩ đó là điều anh ta muốn - anh ta muốn tìm một phần tử sử dụng regex làm định vị (như là một phần của XPATH) – olamundo

+0

Câu hỏi đề cập đến việc nhận * tất cả * liên kết phù hợp với regex. Vì Selenium không hỗ trợ điều này (theo kiến ​​thức của tôi), nhận được tất cả các liên kết từ trang và sau đó sử dụng ngôn ngữ của khách hàng để kiểm tra các vị trí so với cụm từ thông dụng là một giải pháp hợp lý. –

+0

Tôi đã chỉnh sửa mã ví dụ của mình để thực hiện đối sánh cụm từ thông dụng. Tôi đã không làm điều này ban đầu bởi vì nó phụ thuộc vào ngôn ngữ khách hàng được sử dụng, và muốn giữ câu trả lời đơn giản. –

10

Câu trả lời ở trên có lẽ là đúng cách để có tất cả các liên kết phù hợp với một regex, nhưng tôi nghĩ rằng nó cũng sẽ rất hữu ích để trả lời các phần khác của câu hỏi, làm thế nào để sử dụng regex trong Xpath định vị. Bạn cần phải sử dụng các trận đấu regex() chức năng, như thế này:

xpath=//div[matches(@id,'che.*boxes')] 

(này, tất nhiên, sẽ nhấp vào div với 'id = hộp kiểm', hoặc 'id = cheANYTHINGHEREboxes')

Be nhận thức, mặc dù, rằng các chức năng phù hợp không được hỗ trợ bởi tất cả các thực hiện trình duyệt nguyên gốc của Xpath (rõ ràng nhất, bằng cách sử dụng này trong FF3 sẽ ném một lỗi: xpath không hợp lệ [2]).

Nếu bạn gặp sự cố với trình duyệt cụ thể của mình (như tôi đã làm với FF3), hãy thử sử dụng allowNativeXpath của selen ("false") để chuyển sang trình thông dịch JavaScript Xpath. Nó sẽ chậm hơn, nhưng có vẻ như nó hoạt động với nhiều hàm Xpath hơn, bao gồm cả 'các kết quả phù hợp' và 'kết thúc bằng'. :)

+0

làm thế nào để bạn kiểm tra xpath của bạn? Tôi thường sử dụng add firefox trên xpath-checker. Nhưng nó không nhận ra regex trong xpath. – Guy

+0

Sử dụng tiện ích kiểm tra xpath-checker đó là một ý tưởng tuyệt vời! Tôi chưa bao giờ nghĩ tìm một cái. Mặc dù vậy, tôi chưa viết quá nhiều bộ định vị xpath. Trong công việc của tôi, tôi đã xây dựng một khung kiểm thử độc lập với công cụ để xây dựng các trình định vị cho nhiều công cụ, bao gồm cả Selenium, sử dụng cú pháp đơn giản của riêng chúng ta. Tôi chỉ phải học những định vị xpath này đủ tốt để viết một số mã có thể tạo ra chúng. :) –

+0

+1 cho mẹo allowNaticeXPath (false). Đã lưu cho tôi rất nhiều đầu gãi ngay bây giờ :) –

0

Dưới đây là một số phương pháp thay thế cho Selenium RC. Đây không phải là giải pháp Selenium thuần túy, chúng cho phép tương tác với cấu trúc dữ liệu ngôn ngữ lập trình của bạn và Selenium.

Bạn cũng có thể lấy nguồn trang HTML, sau đó biểu thức chính quy nguồn để trả lại một tập hợp các liên kết phù hợp. Sử dụng nhóm regex để tách các URL, liên kết văn bản/ID, v.v. và sau đó bạn có thể chuyển chúng trở lại selen để bấm vào hoặc điều hướng đến.

Phương pháp khác là lấy nguồn trang HTML hoặc innerHTML (thông qua trình định vị DOM) của phần tử gốc/gốc sau đó chuyển HTML thành XML thành đối tượng DOM trong ngôn ngữ lập trình của bạn. Sau đó, bạn có thể duyệt DOM với XPath mong muốn (với biểu thức chính quy hay không), và thu được một nút của chỉ các liên kết quan tâm. Từ phân tích cú pháp của chúng ra văn bản/ID liên kết hoặc URL và bạn có thể quay lại selen để nhấp vào hoặc điều hướng đến.

Khi có yêu cầu, tôi đang cung cấp các ví dụ bên dưới. Đó là ngôn ngữ hỗn hợp vì bài đăng dường như không phải là ngôn ngữ cụ thể. Tôi chỉ sử dụng những gì tôi đã có sẵn để hack với nhau cho các ví dụ. Chúng không hoàn toàn được thử nghiệm hoặc thử nghiệm, nhưng tôi đã làm việc với các bit của mã trước đó trong các dự án khác, vì vậy đây là bằng chứng về các ví dụ về mã khái niệm về cách bạn triển khai các giải pháp mà tôi vừa đề cập.

//Example of element attribute processing by page source and regex (in PHP) 
$pgSrc = $sel->getPageSource(); 
//simple hyperlink extraction via regex below, replace with better regex pattern as desired 
preg_match_all("/<a.+href=\"(.+)\"/",$pgSrc,$matches,PREG_PATTERN_ORDER); 
//$matches is a 2D array, $matches[0] is array of whole string matched, $matches[1] is array of what's in parenthesis 
//you either get an array of all matched link URL values in parenthesis capture group or an empty array 
$links = count($matches) >= 2 ? $matches[1] : array(); 
//now do as you wish, iterating over all link URLs 
//NOTE: these are URLs only, not actual hyperlink elements 

//Example of XML DOM parsing with Selenium RC (in Java) 
String locator = "id=someElement"; 
String htmlSrcSubset = sel.getEval("this.browserbot.findElement(\""+locator+"\").innerHTML"); 
//using JSoup XML parser library for Java, see jsoup.org 
Document doc = Jsoup.parse(htmlSrcSubset); 
/* once you have this document object, can then manipulate & traverse 
it as an XML/HTML node tree. I'm not going to go into details on this 
as you'd need to know XML DOM traversal and XPath (not just for finding locators). 
But this tutorial URL will give you some ideas: 

http://jsoup.org/cookbook/extracting-data/dom-navigation 

the example there seems to indicate first getting the element/node defined 
by content tag within the "document" or source, then from there get all 
hyperlink elements/nodes and then traverse that as a list/array, doing 
whatever you want with an object oriented approach for each element in 
the array. Each element is an XML node with properties. If you study it, 
you'd find this approach gives you the power/access that WebDriver/Selenium 2 
now gives you with WebElements but the example here is what you can do in 
Selenium RC to get similar WebElement kind of capability 
*/ 
+0

Chúng ở đâu? ('Đây là một số phương pháp thay thế ...'), vui lòng cung cấp các ví dụ mã rõ ràng hơn. –

+0

Ok, tôi sẽ cập nhật câu trả lời bằng ví dụ thực tế hoặc liên kết với một ví dụ khi tôi có cơ hội (có thể trong vài ngày hoặc vài tuần, hiện đang bận). – David

+0

Điều đó sẽ được nhiều người đánh giá cao. Cảm ơn bạn. –

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