Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Selenium C#Webdriver FindElements(By.LinkText)RegEx?_C#_Regex_Selenium_Webdriver - Fatal编程技术网

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

Selenium C#Webdriver FindElements(By.LinkText)RegEx?,c#,regex,selenium,webdriver,C#,Regex,Selenium,Webdriver,是否可以通过使用类似a-ZNN:NN:NN:NN的模式搜索网页上的链接,其中N是一个位数(0-9) 我曾在PHP中使用正则表达式将文本转换为链接,因此我想知道是否可以在Selenium和C#中使用这种过滤器来查找外观相同、遵循特定格式的链接 我试过: driver.FindElements(By.LinkText("[A-Z][0-9]{2}):([0-9]{2}):([0-9]{2}):([0-9]{2}")).ToList(); 但这不起作用。有什么建议吗 不要使用正则表达式解析Html

是否可以通过使用类似
a-ZNN:NN:NN:NN
的模式搜索网页上的链接,其中
N
是一个位数(0-9)

我曾在PHP中使用正则表达式将文本转换为链接,因此我想知道是否可以在Selenium和C#中使用这种过滤器来查找外观相同、遵循特定格式的链接

我试过:

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

但这不起作用。有什么建议吗

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

使用

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

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

HtmlWeb hw = new HtmlWeb();
 HtmlDocument doc = hw.Load(/* url */);
 foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a[@href]"))
 {
//collect all links here
 }
步骤2使用此正则表达式匹配列表中的所有链接

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

步骤3您将获得所需的链接。

总之,没有任何
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();
}
//警告:从内存写入的未测试代码。
//不能保证完全正确。
列表匹配链接=新列表();
//假设“驱动程序”是有效的IWebDriver。
ReadOnlyCollection links=driver.FindElements(按.TagName(“a”));
//您可能可以使用LINQ来简化这一点,但这里是
//foreach解
foreach(链接中的IWebElement链接)
{
字符串文本=link.text;
if(Regex.IsMatch(“此处为您的Regex”,text))
{
匹配链接。添加(文本);
}
}
foreach(匹配链接中的字符串链接文本)
{
IWebElement元素=driver.FindElement(By.LinkText(LinkText));
元素。单击();
//在导航到的页面上执行操作
driver.Navigate().Back();
}

我想去那里,而不仅仅是提取它们,我可以按照你说的方式去做,但主要是我想去那里,然后用Selenium点击它们。因此,如果我想使用您的方法,我可能应该使用SeleniumWebDriver获取整个HTML并查找特定的链接文本,然后使用该方法使用findelement搜索链接,但使用之前找到的实际链接文本。你的方法听起来很费劲,一定有一种更简单的硒方法。@Sam我不知道硒,所以不能对此发表评论谢谢你的帮助,我会看看是否能找到硒的特定解决方案,我已经搜索了几天了。我爱你!xD lol非常感谢今晚我会给它一个机会。我已经玩了三天了:)