2012-09-16 45 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