2012-09-16 14 views
5

Ist es möglich, Links auf einer Webseite zu finden, indem Sie deren Text mit einem Muster wie A-ZNN:NN:NN:NN suchen, wobei N eine einzelne Ziffer (0-9) ist.Selen C# Webdriver FindElements (By.LinkText) RegEx?

Ich habe Regex in PHP verwendet, um Text in Links umzuwandeln, also frage ich mich, ob es möglich ist, diese Art von Filter in Selenium mit C# zu verwenden, um Links zu finden, die nach einem bestimmten Format alle gleich aussehen.

Ich habe versucht:

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

Aber das hat nicht funktioniert. Irgendein Rat?

Antwort

7

In einem Wort, nein, keine der FindElement() Strategien unterstützen die Verwendung von regulären Ausdrücken zum Suchen von Elementen. Der einfachste Weg wäre, FindElements() zu verwenden, um alle Links auf der Seite zu finden und ihre .Text-Eigenschaft mit Ihrem regulären Ausdruck abzugleichen.

Beachten Sie jedoch, dass wenn Sie auf den Link klicken, zu einer neuen Seite im selben Browserfenster navigiert (dh, wenn Sie auf den Link klicken, wird kein neues Browserfenster geöffnet), müssen Sie den genauen Text von allen erfassen der Links, auf die Sie zur späteren Verwendung klicken möchten. Ich erwähne das, weil, wenn Sie versuchen, die Verweise auf die Elemente zu halten, die während Ihrer ursprünglichen FindElements() Aufruf gefunden werden, werden sie abgestanden, nachdem Sie auf die erste klicken. Wenn dies Ihr Szenario ist, könnte der Code wie folgt aussehen:

// 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

Ich liebe dich! xD lol, vielen Dank, ich werde heute Nacht eine Chance geben, seit 3 ​​Tagen damit herumzuspielen :) – Sam

1

Verwenden Sie Regex nicht, um HTML zu analysieren.

Verwenden htmlagilitypack

Sie diese Schritte folgen:

Schritt 1 Verwenden HTML PARSER extrahieren alle Links von der jeweiligen Webseite eine Liste und speichern in.

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

Schritt 2 Verwenden Sie diese Regex in der

Liste mit allen Links entsprechen
.*?[A-Z]\d{2}:\d{2}:\d{2}:\d{2}.*? 

Schritt 3 Sie Ihre gewünschten Links.

+0

Nun, ich dort Standorte erhalten wollen, anstatt sie nur zu extrahieren ich die Art und Weise tun können Sie gesagt haben, aber vor allem möchte ich dort Standorte erhalten und klicken Sie auf Sie verwenden Selen. Also, wenn ich Ihre Methode verwenden möchte, sollte ich wahrscheinlich Selenium webdriver verwenden, um die Gesamtheit des HTML zu nehmen und spezifische Links zu finden, den Text dann verwenden, um nach Links zu suchen, die findelement aber mit dem tatsächlichen Verbindungstext früher finden. Ihre Methode klingt so, als würde sie den langen Weg nehmen, da es für Selen eine einfachere Methode geben muss. – Sam

+0

@Sam ich weiß nicht über Selenium, so kann ich es nicht kommentieren – Anirudha

+0

Danke für Ihre Hilfe Ich werde sehen, ob ich eine selenspezifische Lösung finden kann, ich habe seit ein paar Tagen gesucht. – Sam