【问题标题】:Selenium C# Webdriver FindElements(By.LinkText) RegEx?Selenium C# Webdriver FindElements(By.LinkText) 正则表达式?
【发布时间】:2016-06-03 04:36:08
【问题描述】:

是否可以通过使用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();

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

【问题讨论】:

    标签: c# regex selenium webdriver


    【解决方案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();
    }
    

    【讨论】:

    • 我爱你! xD 哈哈,非常感谢,今晚我会试一试,现在已经搞砸了 3 天了 :)
    【解决方案2】:

    不要使用正则表达式来解析 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 步您将获得所需的链接。

    【讨论】:

    • 好吧,我想到达那里的位置,而不是仅仅提取它们,我可以按照你说的方式做,但主要是我想到达那里的位置并使用 Selenium 单击它们。因此,如果我想使用您的方法,我可能应该使用 Selenium webdriver 来获取整个 HTML 并找到特定的链接文本,然后使用它来使用 findelement 搜索链接,但使用之前找到的实际链接文本。您的方法听起来好像走了很长一段路,Selenium 肯定有一个更简单的方法。
    • @Sam 我不知道 Selenium,所以无法评论它
    • 感谢您的帮助,我会看看是否可以找到特定于 Selenium 的解决方案,我已经搜索了几天。
    猜你喜欢
    • 2013-10-12
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多