Selenium C#Webdriver FindElements(By.LinkText)RegEx?

时间:2012-09-16 14:28:36

标签: c# regex selenium webdriver

是否可以通过使用A-ZNN:NN:NN:NN等模式搜索文本来查找网页上的链接,其中N是一位数字(0-9)。

我在PHP中使用Regex将文本转换为链接,所以我想知道是否可以在Selenium中使用这种过滤器和C#来查找按照特定格式看起来相同的链接。

我试过了:

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

但是这没用。有什么建议?

2 个答案:

答案 0 :(得分:8)

总之,不,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 :(得分:1)

不要使用正则表达式来解析Html。

使用htmlagilitypack

您可以按照以下步骤操作:

Step1 使用HTML PARSER从特定网页中提取所有链接并将其存储到列表中。

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

Step2 使用此正则表达式匹配列表中的所有链接

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

第3步您可以获得所需的链接。