C# 使用Webdriver循环浏览页面上的每个链接

C# 使用Webdriver循环浏览页面上的每个链接,c#,javascript,selenium,selenium-webdriver,C#,Javascript,Selenium,Selenium Webdriver,我被要求创建一个测试,它可以使用C语言中的webdriver循环浏览页面上的所有链接 我真的不知道从哪里开始,所以很抱歉没有提供任何代码 我需要以某种方式选择页面上的所有链接,并将它们放入数组或类似的数组中,它们只需在其中循环,单击链接,返回到上一页,单击下一个链接等。我假设它是在以下行中: foreach (var item in _driver.FindElements(By.TagName("a"))) { Trace.WriteLi

我被要求创建一个测试,它可以使用C语言中的webdriver循环浏览页面上的所有链接

我真的不知道从哪里开始,所以很抱歉没有提供任何代码


我需要以某种方式选择页面上的所有链接,并将它们放入数组或类似的数组中,它们只需在其中循环,单击链接,返回到上一页,单击下一个链接等。

我假设它是在以下行中:

        foreach (var item in _driver.FindElements(By.TagName("a")))
        {
            Trace.WriteLine(item.GetAttribute("href"));
        }
编辑: 注:这是由head和使用NUnit的近似解编写的

[TestFixture]
class UnitTests
{
    [TestFixtureSetUp]
    public void FixtureSetup()
    {
        _driver = new ChromeDriver();
        _driver.Manage().Timeouts().ImplicitlyWait(Defaultamount);
        _wait = new WebDriverWait(_driver, Defaultamount);
    }
    [TestFixtureTearDown]
    public void FixtureTearDown()
    {
        _driver.Quit();
    }
    //...
}
代码应该是以下几行:

    [TestCase("www.googel.com")]
    public bool TestAllWebpageLinks(string url, Result = true)
    {
        _driver.Navigate().GoToUrl(url);
        var result = _driver.FindElements(By.TagName("a"))
            .Select(o=>o.GetAttribute("href"))
            .ToDictionary(o=>o,o=>TestPage(url,o));
        return result.All(o => o.Value);
    }
    public bool TestPage(string url, string link){
        try
        {
            _driver.Navigate().GoToUrl(url);
            _driver.FindElement(By.XPath("//a[@href='"+link+"']")).Click();     
            return true;
        }
        catch (Exception ex)
        {
            return false;
        }
    }
请注意,Resharper插件将大大简化单元测试的运行

请看这里:

因为你提到的是一个页面而不是整个站点,所以有一些简单的方法

使用//a…的xpath定位器填充IWebElements的实现,或如Margus所述通过标记名获取它

然后循环执行此操作并单击IWebElements列表中的每个IWebElement。将driver.Url保存在一个项目列表中,以备以后查看或输出,以及从页面中捕获的其他内容。如果要检查的参数已知,可以在此处进行验证。然后执行driver.Navigate.Back。这将使您回到上一个位置来测试下一个元素。可能还希望保存href以及Margus建议的内容,并将其与另一页上的driver.Url进行比较

根据评论更新


然后,您的列表将是该类的列表,该类将具有您想要的每个链接的特定属性以及新url的导航。然后,如果您想跟踪其他内容或测试其他内容,您可以很容易地在此基础上添加内容。

使用Selenium WebDriver,您只需调用:

driver.findElementsBy.TagNamea返回匹配WebElement的集合。 或者,如果您需要更多选项,您可以使用类似于webdriver的库,它可以让您调用以下内容:

getElementsByTagNamea; 您还可以使用其他外部助手,如:

FluentAutomation可帮助您编写测试代码
这取决于您的页面以及链接的生成方式。

这个完整的程序可能会对您有所帮助:代码是用Java编写的

我正在打印所有链接名称

import java.util.List;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;

public class TrailRuns 
{
    public static void main(String[] args) throws Exception
    {
        WebDriver driver = new FirefoxDriver();
        driver.get("http://www.googl.com/");
        driver.manage().window().maximize();

        List<WebElement> objWEs = driver.findElements(By.tagName("a"));

        for(WebElement ele:objWEs)
            System.out.println(ele.getText());
    }
}

你会得到一个更清晰的问题,更好的回答。让我们假设您正在尝试通常所说的导航测试。我无法推荐足够好的Coypu,它是selenium/webdriver的包装器。它的方式更容易使用比裸webdriver。这似乎是我需要的,但我对这一切都很陌生,我该如何进行测试。点击foreach中的每个链接?所以,让它点击链接。导航到上一个,点击下一个链接等。你最初的评论说它已被编辑,但没有任何变化:S+1,但似乎有点过火不确定你为什么要修改整个list@Arran他想做一个测试。这就是如何设置测试环境。测试本身转到一个页面并获取所有链接。它将单击所有链接,其中一些链接可能会失败。我做了一个假设,如果有人做了,那么他想看看做了什么,字典将包含这个信息链接->页面加载成功。假设的目标是测试是否所有页面都成功加载。如果某件事情失败了,他想看看失败的是什么,那么字典很有用——想象一下返回结果处的断点。Allo=>o.Value;所以你基本上是把这个列表转换成其他的列表。这就是Select的设计目的,而不是设计成字典。就像我说的,这个解决方案很有效,但是你不需要把它放到字典里。在foreach Margus发布的文章中,我如何单击每个选中的链接?我以前从未使用过IWebElements列表。对于每次迭代中的每个web元素,都会使用web元素的控件。
import java.util.List;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;

public class TrailRuns 
{
    public static void main(String[] args) throws Exception
    {
        WebDriver driver = new FirefoxDriver();
        driver.get("http://www.googl.com/");
        driver.manage().window().maximize();

        List<WebElement> objWEs = driver.findElements(By.tagName("a"));

        for(WebElement ele:objWEs)
            System.out.println(ele.getText());
    }
}