2012-09-16 42 views
5

Es posible encontrar enlaces en una página web buscando su texto usando un patrón como A-ZNN:NN:NN:NN, donde N tiene un dígito (0-9).Selenium C# Webdriver FindElements (By.LinkText) RegEx?

He usado Regex en PHP para convertir texto en enlaces, así que me preguntaba si es posible usar este tipo de filtro en Selenium con C# para encontrar enlaces que se vean todos iguales, siguiendo un formato determinado.

me trataron:

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

Pero esto no funcionó. ¿Algún consejo?

Respuesta

7

En una palabra, no, ninguna de las estrategias de FindElement() admite el uso de expresiones regulares para encontrar elementos. La forma más sencilla de hacer esto sería usar FindElements() para buscar todos los enlaces en la página y unir su propiedad .Text a su expresión regular.

Tenga en cuenta que si al hacer clic en el enlace se accede a una nueva página en la misma ventana del navegador (es decir, no abre una nueva ventana al hacer clic en el enlace), deberá capturar el texto exacto de todos de los enlaces en los que desea hacer clic para utilizarlos más adelante. Menciono esto porque si intenta retener las referencias a los elementos encontrados durante su llamada inicial FindElements(), quedarán obsoletos después de hacer clic en el primero. Si esta es tu escenario, el código podría ser algo como esto:

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

¡Te amo! xD lol muchas gracias voy a dar una oportunidad esta noche ha estado jugando con esto durante 3 días ahora :) – Sam

1

No utilice regex para analizar HTML.

Uso htmlagilitypack

Puede seguir estos pasos:

Paso 1HTML PARSER uso para extraer todos los enlaces de la página web en particular y almacenarlo en una lista.

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

Paso 2 Utilice esta expresión regular para que coincida con todos los eslabones de la lista

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

Paso 3 Se obtiene sus enlaces deseados.

+0

Bueno, yo quiero llegar Los lugares en vez de simplemente extrayéndolos que pueda hacer el camino que has dicho, pero principalmente quiero llegar Los lugares y haga clic ellos usando Selenio. Entonces, si quiero usar su método, probablemente debería usar Selenium webdriver para tomar la totalidad del HTML y buscar enlaces específicos, luego usar eso para buscar enlaces utilizando findelement pero con el texto del enlace actual encontrado previamente. Su método parece que está tomando el camino más largo debe haber un método más simple para el selenio. – Sam

+0

@Sam no sé nada sobre Selenium, así que no puedo comentar – Anirudha

+0

Gracias por su ayuda, veré si puedo encontrar una solución específica de Selenium, he estado buscando por unos días. – Sam

Cuestiones relacionadas