使用Webdriver遍历页面上的每个链接

时间:2014-07-31 12:09:04

标签: c# javascript selenium selenium-webdriver

我被要求创建一个测试,该测试可以使用C#中的webdriver遍历页面上的所有链接。

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

我需要以某种方式选择页面上的所有链接并将它们放入数组等中,然后只需循环浏览它们,点击链接,返回上一页,点击下一个链接等。

4 个答案:

答案 0 :(得分:3)

我认为它符合以下几行:

        foreach (var item in _driver.FindElements(By.TagName("a")))
        {
            Trace.WriteLine(item.GetAttribute("href"));
        }

编辑:

请注意,这是使用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插件将简化运行单元测试。

答案 1 :(得分:1)

请看这里:How to browse a whole website using selenium?

由于您提到了一个页面而不是整个网站,因此有一些简单的方法。

使用IWebElements的xpath定位器填充//a的实现...或者通过标记名获取它作为Margus提及。

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

根据评论进行更新

public class Links
{
    public string LinkName { get; set; }
    public string href { get; set; }
    public string newPageUrl { get; set; }
}

string newPageUrl = "";
string linkName = "";
string href = "";
List<Links> links = new List<Links>();
foreach (IWebElement item in _driver.FindElements(By.TagName("a")))
{
    href = item.GetAttribute("href");
    linkName = item.text();
    item.click();
    newPageUrl = driver.Url();
    links.Add(new Links
         {
             NewPageUrl  = newPageUrl,
             Href = href,
             LinkName = linkName
         });
    driver.Navigate().Back();
}

然后您的列表将是该类的列表,该列将具有您想要的每个链接的特定属性以及使用新URL的导航。然后,如果您想跟踪其他内容或测试其他内容,您可以轻松添加内容。

答案 2 :(得分:0)

使用Selenium-WebDriver,您只需致电:

  • driver.findElements(By.TagName(&#34; a&#34;))返回匹配的webelements集合。

或者,如果您想要更多选项,可以使用像http://sizzlejs.com/这样的库和webdriver,这样可以让您调用类似的内容:

  • 的getElementsByTagName(&#34;&#34);

您还可以使用其他外部帮助:

  • FluentAutomation帮助您测试代码

这取决于您的网页以及链接的生成方式。

答案 3 :(得分:0)

这个完整的程序可能对您有所帮助:代码是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());
    }
}