2012-09-16 13 views
5

A-ZNN:NN:NN:NN जैसे पैटर्न का उपयोग करके अपने टेक्स्ट को खोजकर वेबपृष्ठ पर लिंक ढूंढना संभव है, जहां N एक अंक (0-9) है।सेलेनियम सी # वेबड्राइवर FindElements (By.LinkText) RegEx?

मैंने टेक्स्ट में टेक्स्ट को बदलने के लिए PHP में रेगेक्स का उपयोग किया है, इसलिए मैं सोच रहा था कि सेलेनियम में सी # के साथ इस प्रकार के फ़िल्टर का उपयोग करना संभव है, जो कि लिंक को खोजने के लिए एक निश्चित प्रारूप के बाद दिखाई देगा।

मैंने कोशिश की:

driver.FindElements(By.LinkText("[A-Z][0-9]{2}):([0-9]{2}):([0-9]{2}):([0-9]{2}")).ToList(); 

लेकिन यह काम नहीं किया। कोई सलाह?

उत्तर

7

एक शब्द में, नहीं, FindElement() रणनीतियों में से कोई भी तत्वों को खोजने के लिए नियमित अभिव्यक्तियों का उपयोग करके समर्थन नहीं करता है। ऐसा करने का सबसे आसान तरीका पृष्ठ पर सभी लिंक खोजने के लिए FindElements() का उपयोग करना होगा, और अपनी नियमित अभिव्यक्ति में .Text संपत्ति से मेल खाना होगा।

ध्यान दें कि यदि लिंक पर क्लिक करना उसी ब्राउज़र विंडो में किसी नए पृष्ठ पर नेविगेट करता है (यानी, लिंक पर क्लिक करते समय कोई नई ब्राउज़र विंडो नहीं खुलती है), तो आपको सभी का सटीक टेक्स्ट कैप्चर करना होगा उन लिंकों का उपयोग जिन्हें आप बाद में उपयोग के लिए क्लिक करना चाहते हैं। मैं इसका जिक्र करता हूं क्योंकि यदि आप अपने शुरुआती FindElements() कॉल के दौरान पाए गए तत्वों के संदर्भों को पकड़ने का प्रयास करते हैं, तो आप पहले व्यक्ति पर क्लिक करने के बाद बासी हो जाएंगे। यह आपके परिदृश्य है, कोड कुछ इस तरह दिख सकता है:

// WARNING: Untested code written from memory. 
// Not guaranteed to be exactly correct. 
List<string> matchingLinks = new List<string>(); 

// Assume "driver" is a valid IWebDriver. 
ReadOnlyCollection<IWebElement> links = driver.FindElements(By.TagName("a")); 

// You could probably use LINQ to simplify this, but here is 
// the foreach solution 
foreach(IWebElement link in links) 
{ 
    string text = link.Text; 
    if (Regex.IsMatch("your Regex here", text)) 
    { 
     matchingLinks.Add(text); 
    } 
} 

foreach(string linkText in matchingLinks) 
{ 
    IWebElement element = driver.FindElement(By.LinkText(linkText)); 
    element.Click(); 
    // do stuff on the page navigated to 
    driver.Navigate().Back(); 
} 
+1

मैं तुमसे प्यार करता हूँ! एक्सडी लॉल बहुत बहुत धन्यवाद, मैं इसे आज रात एक शॉट दूंगा, इसके साथ 3 दिनों के लिए इस पर गड़बड़ कर रहा हूं :) – Sam

1

एचटीएमएल पार्स करने के लिए regex का उपयोग न करें।

उपयोग htmlagilitypack

आप इन चरणों का पालन कर सकते हैं:

चरण 1 उपयोग HTML PARSER विशेष वेबपेज से सभी लिंक निकालें और यह एक सूची में स्टोर करने के लिए।

HtmlWeb hw = new HtmlWeb(); 
HtmlDocument doc = hw.Load(/* url */); 
foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a[@href]")) 
{ 
//collect all links here 
} 

चरण 2 इस regex का उपयोग सूची में सभी लिंक मैच के लिए

.*?[A-Z]\d{2}:\d{2}:\d{2}:\d{2}.*? 

चरण 3 आप अपने वांछित लिंक मिलता है।

+0

खैर मैं वहाँ स्थानों मिलता बल्कि सिर्फ उन्हें निकालने की तुलना में मैं जिस तरह से आप ने कहा है, लेकिन मुख्य रूप से मैं वहाँ स्थानों प्राप्त करना चाहते हैं और क्लिक कर सकते हैं करना चाहते हैं वे सेलेनियम का उपयोग कर। इसलिए यदि मैं आपकी विधि का उपयोग करना चाहता हूं तो मुझे शायद सेलेनियम वेबड्राइवर का उपयोग HTML की संपूर्णता लेने के लिए करना चाहिए और विशिष्ट लिंक टेक्स्ट ढूंढना चाहिए, फिर उस खोज का उपयोग करके लिंक खोजने के लिए उपयोग करें, लेकिन पहले मिले वास्तविक लिंक टेक्स्ट के साथ। आपकी विधि लगता है कि इसके चारों ओर लंबा रास्ता लेना सेलेनियम के लिए एक आसान तरीका होना चाहिए। – Sam

+0

@ सैम मुझे सेलेनियम के बारे में पता नहीं है, तो इस पर टिप्पणी नहीं कर सकते – Anirudha

+0

आपकी मदद के लिए धन्यवाद मैं देखता हूं कि मुझे सेलेनियम विशिष्ट समाधान मिल सकता है, मैं अब कुछ दिनों के लिए खोज कर रहा हूं। – Sam