一尘不染

Selenium C#Webdriver FindElements(By.LinkText)正则表达式?

selenium

是否可以通过使用诸如的模式搜索网页上的链接来找到网页上的链接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();

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


阅读 713

收藏
2020-06-26

共1个答案

一尘不染

简而言之,没有一种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();
}
2020-06-26