【问题标题】:Iterating Through Links With Selenium WebDriver w/ C#使用带有 C# 的 Selenium WebDriver 遍历链接
【发布时间】:2019-12-31 05:17:08
【问题描述】:

我有一个项目可以使用带有 C# 的 Selenium WebDriver 单击网页上的特定链接,我正在努力寻找一种干净的方法来使用一个考虑特定情况的数组来遍历它们。

我了解基本的 driver.FindElement(By.XPath(" "));

但我不确定如何创建一个 WebElement 数组来提供一个 foreach 语句,该语句将在特定 div 类中搜索 By.TagName("a") 而无需拉动页面上的每个链接。

网站标题的示例:

<header>
    <div id="ContainerTopStrip">
        <div class="ContainerWidth">
            <div class="headerMenu">
                <a href="Account/IntakeLogin" title="Report">Report</a>
                <a href="/rfs" title="Request">Request</a>
                <a href="javascript:void(0);" onclick="openFullWindow();" title="Lookup">Lookup</a>
            </div>
        </div>
    </div>
</header>

我刚刚使用 findelement 的基本示例:

using System;
using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Support.UI;
using OpenQA.Selenium.Chrome;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        using (IWebDriver driver = new ChromeDriver("C:\\"))
        {
            driver.Navigate().GoToUrl("xxx");
            driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(60);

            driver.FindElement(By.XPath("//a[text()=\"xxx\"]")).Click();
            // TODO: Figure out how to assert route change occurred

            driver.FindElement(By.XPath("//a[text()=\"xxx\"]")).Click();
            driver.Navigate().Back();

            driver.FindElement(By.XPath("//a[text()=\"xxx/I\")]")).Click();
            driver.Navigate().Back();

            Console.WriteLine("This is what happens when you don't know how to make an array.");
            driver.Quit();
        }    
    }
}

总结一下:

需要帮助找到一种方法来创建一个数组,该数组可以找到要在循环中单击的特定链接,因为在搜索了一段时间之后,这似乎是最简洁的解决方案。如果有更好的建议,我愿意接受。总的来说,对 C#/Selenium 来说是全新的。

【问题讨论】:

    标签: c# .net selenium-webdriver visual-studio-code


    【解决方案1】:

    您可以使用 selenium 提供的FindElements 方法来获取列表中的所有元素。然后您可以使用GetAttribute() 方法获取href 并导航到它们中的每一个。

    IReadOnlyCollection<IWebElement> elementList = Driver.FindElements(By.XPath(".//div[@class='headerMenu']"));
    foreach (IWebElement item in t){
    Driver.Navigate.GoToUrl(item.GetAttribute("href"));
    Driver.Navigate().Back();
    }            
    

    【讨论】:

      【解决方案2】:

      你可以通过确定链接的xpath来获取所有的链接

      var links = myWebDriver.FindElements(By.XPath("/html/body/div[2]/header/div[1]/div/div/a"));
      
      //loop through all header links
      for (int i = 0; i < links.Count; i++)
      {
          //reassignment because of reloading the page after each navigation
          links = myWebDriver.FindElements(By.XPath("/html/body/div[2]/header/div[1]/div/div/a"));
          myWebDriver.Navigate().GoToUrl(links[i].GetAttribute("href"));
          //or you can click
          //links[i].Click();
          myWebDriver.Navigate().Back();
      }
      

      下一个链接如图所示:

      var links2 = myWebDriver.FindElements(By.XPath("/html/body/div[2]/header/div[2]/div/ul/li/a"));
      for (int i = 0; i < links2.Count; i++)
      {
          links2 = myWebDriver.FindElements(By.XPath("/html/body/div[2]/header/div[2]/div/ul/li/a"));
          myWebDriver.Navigate().GoToUrl(links2[i].GetAttribute("href"));
          //or you can click        
          //links2[i].Click();
          myWebDriver.Navigate().Back();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多