2012-09-16 7 views
5

È possibile trovare i collegamenti su una pagina Web ricercandone il testo utilizzando un modello come A-ZNN:NN:NN:NN, dove N è una singola cifra (0-9).Selenium C# Web Finder Elements (By.LinkText) RegEx?

Ho usato Regex in PHP per trasformare il testo in collegamenti, quindi mi chiedevo se fosse possibile utilizzare questo tipo di filtro in Selenium con C# per trovare collegamenti che sembrassero tutti uguali, seguendo un determinato formato.

ho provato:

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

Ma questo non ha funzionato. Qualche consiglio?

risposta

7

In una parola, nessuna delle strategie FindElement() supporta le espressioni regolari per la ricerca di elementi. Il modo più semplice per farlo sarebbe utilizzare FindElements() per trovare tutti i collegamenti nella pagina e associare la loro proprietà .Text all'espressione regolare.

Si noti tuttavia che se facendo clic sul collegamento si passa a una nuova pagina nella stessa finestra del browser (ovvero, non si apre una nuova finestra del browser quando si fa clic sul collegamento), sarà necessario acquisire il testo esatto di tutti dei link su cui desideri fare clic per un utilizzo futuro. Dico questo perché se cerchi di mantenere i riferimenti agli elementi trovati durante la tua chiamata iniziale FindElements(), saranno stantii dopo aver fatto clic sul primo. Se questo è lo scenario, il codice potrebbe essere qualcosa di simile:

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

Ti amo! xD lol grazie mille Darò a questo uno scatto stasera ho giocato con questo per 3 giorni ora :) – Sam

1

Non utilizzare regex per analizzare Html.

Usa htmlagilitypack

È possibile seguire questi passaggi:

Step1 Usa HTML PARSER per estrarre tutti i link dalla pagina web particolare e conservarla in un elenco.

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

Step2 Utilizzare questa regex per abbinare tutti i collegamenti nell'elenco

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

Fase 3 È possibile ottenere i vostri collegamenti desiderati.

+0

Beh io vuole arrivare posizioni e non solo loro estrazione posso fare il modo che hai detto, ma soprattutto voglio arrivare lì posizioni e fare clic su usando il selenio. Quindi, se voglio usare il tuo metodo, probabilmente dovrei usare il selettore web Selenium per prendere la totalità dell'HTML e trovare il testo di link specifici, quindi usarlo per cercare i link usando findelement ma con il testo del link attuale trovato in precedenza. Il tuo metodo suona come se percorrendo la strada più lunga ci deve essere un metodo più semplice per il selenio. – Sam

+0

@Sam non so di Selenium quindi, non posso commentare su di esso – Anirudha

+0

Grazie per il vostro aiuto vedrò se riesco a trovare una soluzione specifica Selenium, ho cercato per alcuni giorni. – Sam