2012-09-16 81 views
5

是否有可能通過使用像A-ZNN:NN:NN:NN這樣的模式搜索其文本來找到網頁上的鏈接,其中N是單個數字(0-9)。Selenium C#Webdriver FindElements(By.LinkText)正則表達式?

我已經在PHP中使用正則表達式將文本轉換爲鏈接,所以我想知道是否有可能在C#中使用這種類型的Selenium過濾器來查找所有看起來相同的鏈接,遵循特定的格式。

我想:

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

我愛你! xD哈哈,非常感謝我今晚會爲此拍攝一張照片,現在已經搞亂了3天了:) – Sam

1

不要使用正則表達式來解析Html。

使用htmlagilitypack

您可以按照下列步驟操作:

第一步使用HTML PARSER來提取特定網頁上的所有鏈接並將其存儲到一個列表。

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

第二步使用此正則表達式匹配列表中的所有鏈接

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

步驟3你得到你想要的鏈接。

+0

好吧,我要到那裏的位置,而不是僅僅提取他們,我可以做你說的方式,但主要是我要到那裏的位置,然後點擊他們使用硒。因此,如果我想使用你的方法,我應該使用Selenium webdriver來獲取整個HTML並找到特定的鏈接文本,然後使用它來使用findelement搜索鏈接,但使用之前找到的實際鏈接文本。你的方法聽起來像是要花很長時間,Selenium必須有一個更簡單的方法。 – Sam

+0

@Sam我dnt知道硒因此,不能評論它 – Anirudha

+0

感謝您的幫助,我會看看如果我能找到一個硒特定的解決方案,我一直在尋找幾天。 – Sam