当前位置: 首页 > 知识库问答 >
问题:

使用Selenium WebDriver W/C#迭代链接

邢卓
2023-03-14

我有一个项目要用C#使用Selenium WebDriver点击web页面上的特定链接,我正在努力找到一种干净的方法,用一个数组来迭代这些链接,以说明特定的情况。

<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>
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完全陌生。

共有1个答案

薛焱
2023-03-14

您可以通过确定链接的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();
}
 类似资料:
  • 本文向大家介绍C++ 使用输出迭代器,包括了C++ 使用输出迭代器的使用技巧和注意事项,需要的朋友参考一下 示例 通过将输出迭代器传递给函数,可以返回相同类型的多个值。这对于一般功能(例如标准库的算法)尤其常见。 例: 用法示例:            

  • 问题内容: 如果我在java中的链表上使用了for-each循环,是否可以保证以它们在列表中出现的顺序迭代元素? 问题答案: 保证链表按顺序运行。 从文档中 有序集合(也称为序列)。该界面的用户可以精确控制列表中每个元素的插入位置。用户可以通过其整数索引(列表中的位置)访问元素,并在列表中搜索元素。 iterator() 以适当的顺序返回此列表中元素的迭代器。

  • 迭代器可被用来访问一个容器类的所包函的全部元素,其行为像一个指针。举一个例子,你可用一个迭代器来实现对vector容器中所含元素的遍历。有这么几种迭代器如下: 迭代器 描述 input_iterator 提供读功能的向前移动迭代器,它们可被进行增加(++),比较与解引用(*)。 output_iterator 提供写功能的向前移动迭代器,它们可被进行增加(++),比较与解引用(*)。 forwar

  • 问题内容: 编辑:获得一些反馈后,我创建了一个新示例,该示例应更具可重复性。 我一直在用C 编写一个项目,其中涉及许多链表迭代。为了获得基准,我重写了Go中的代码。令人惊讶的是,我发现即使将-O标志传递给clang ,Go实现的运行速度也始终稳定〜10%。可能我只是缺少一些C ++的明显优化,但是我已经通过各种调整将自己的头撞墙了一段时间了。 这是一个简化的版本,在C 和Go中具有相同的实现,其中

  • 迭代器模式(Iterator Pattern) 目前已经是一个没落的模式, 基本上没人会单独写一个迭代器, 除非是产品性质的开发, 其定义如下: 它提供一种方法访问一个容器对象中各个元素, 而又不需暴露该对象的内部细节。

  • 本文向大家介绍C++ 向量迭代器,包括了C++ 向量迭代器的使用技巧和注意事项,需要的朋友参考一下 示例 begin将an返回iterator到序列容器中的第一个元素。 end返回iterator末尾的第一个元素。 如果矢量对象const,无论是begin和end返回const_iterator。如果const_iterator即使向量不返回,也要返回const,则可以使用cbegin和cend。