【问题标题】:C# Selenium how to get all links to list and click randomC# Selenium 如何获取所有链接到列表并随机点击
【发布时间】:2019-11-13 16:03:20
【问题描述】:

我想获得我已经在我的页面上看到的列表的链接。

但是有一种情况,只有匹配的关键字和链接应该在列表中。就像它的abc.com 一样,它应该只得到abc.com links。所以这意味着有no external link

之后,应该是随机点击链接,这是我从列表中获得的。

基本上;点击页面上的随机链接。

  • 选择页面上的所有互联网链接
  • 随机点击一个
  • 重复一遍

【问题讨论】:

  • 只使用 findElements, 和 xpath of "//a[contains(@href, "abc.com")]... 然后选择一个随机元素点击如果 size > 0。如果页面正在使用 javascript 填充 DOM 记得使用 webdriver 等待并可能检查过时的元素异常。

标签: c# selenium


【解决方案1】:

如果我的理解是正确的,您需要一种可以将特定链接作为参数传递的方法,如果没有传递的链接,您将单击列表中的随机链接。

请参阅下面的示例实现。

   //Click one link randomly
    private void ClickRandomLink(string linkText = null)
    {
       //get all links
        var links = _driver.FindElements(By.TagName("a")).ToList();

        if (!string.IsNullOrEmpty(linkText))
        {
            var link = links.FirstOrDefault(x => x.GetAttribute("href").Equals(linkText)) ??
                       throw new Exception($"Link with name: {linkText} not found");
            link.Click();
        }
        else
        {
            //click random element in list
            links.ElementAt(new Random().Next(0, links.Count - 1)).Click();
        }
     }

随机点击所有可用链接

    private void ClickRandomLinks(string linkText = null)
    {
        //get all links
        var links = _driver.FindElements(By.TagName("a")).ToList();

        //click all links matching predicate
        if (!string.IsNullOrEmpty(linkText))
        {
            var linkElements = links.Where(x => x.GetAttribute("href").Contains(linkText)).ToList();
            if(!linkElements.Any()) throw new Exception($"Links with name: {linkText} not found");

            //Generate random order
            var randomElements = Enumerable.Range(0, linkElements.Count-1).OrderBy(x => Guid.NewGuid()).ToList();
            randomElements.ForEach(x => linkElements.ElementAt(x).Click());
        }
        else
        {
            //click all links randomnly
            var randomElements = Enumerable.Range(0, links.Count-1).OrderBy(x => Guid.NewGuid()).ToList();
            randomElements.ForEach(x => links.ElementAt(x).Click());                
        }
    }

希望这会有所帮助。

【讨论】:

  • 我添加了一种新方法来随机点击所有链接并点击符合您条件的链接。
【解决方案2】:

使用您在带有链接的页面上找到的元素创建一个 Web 元素列表。然后使用有效的 abc.com 列表创建另一个列表,并用正确的链接填充它。断言两个列表的长度相等。然后创建一个随机数,选择网页元素列表的索引(LinkElements)然后点击该元素。

List<WebElement> LinkElements = driver.FindElements(By.Id(“element id”));

List<string> ValidLinks = new List<string>();  

foreach(WebElement LinkElement in LinkElements){
  string LinkString = LinkElement.GetAttribute("href");
  if(Equals("abc.com", LinkString.SubString(0, 7))){
    ValidLinks.Add(LinkString);
    }
}

CollectionAssert.AreEquivalent(Links.Count, ValidLink.Count);

Random r = new Random();
LinksElements[r.Next(0,LinksElements.Count)].Click();

【讨论】:

  • 给出了太多错误。我不明白在第二行写什么。
  • 在第二行你应该改变元素选择器。基本上,您应该使用 FindElements 方法将所有元素收集到一个数组中。然后进入foreach,您应该检查元素href属性值是否为abc.com,如果将它们添加到另一个列表中并进行比较。现在我要更新答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-02
  • 1970-01-01
  • 2013-06-03
  • 1970-01-01
  • 1970-01-01
  • 2020-11-27
  • 2017-11-14
相关资源
最近更新 更多